From 1f79ee2cd93f3b61cc08b48dc0e47a26dfae232a Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Fri, 10 Jun 2022 20:06:58 +1200 Subject: [PATCH] Traverse class hierarchy to locate [Ignore] attrs By manually traversing the object hierarchy, we can ensure all [Ignore] attributes, and attributes the derived from [IgnoreAttribute] are found. Fixes #1010 Fixes #661 Fixes #656 --- src/SQLite.cs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/SQLite.cs b/src/SQLite.cs index ee172b39..8a3d0a46 100644 --- a/src/SQLite.cs +++ b/src/SQLite.cs @@ -2469,7 +2469,7 @@ public TableMapping (Type type, CreateFlags createFlags = CreateFlags.None) var cols = new List(members.Count); foreach(var m in members) { - var ignore = m.IsDefined(typeof(IgnoreAttribute), true); + var ignore = IsIgnored(type, m); if(!ignore) cols.Add(new Column(m, createFlags)); } @@ -2496,6 +2496,29 @@ public TableMapping (Type type, CreateFlags createFlags = CreateFlags.None) _insertColumns = Columns.Where (c => !c.IsAutoInc).ToArray (); _insertOrReplaceColumns = Columns.ToArray (); } + + private bool IsIgnored(Type declaringType, MemberInfo m) + { + var attributes = m.GetCustomAttributes(typeof(IgnoreAttribute), true); + if (attributes.Any(x => x is IgnoreAttribute)) + return true; + + if (declaringType.BaseType == null) + return false; + + var newDeclaringType = declaringType; + var newMember = m; + do + { + newDeclaringType = newDeclaringType.BaseType; + if (newDeclaringType == null) + return false; + newMember = newDeclaringType.GetMember(m.Name).FirstOrDefault(); + + } while (newMember == null); + + return IsIgnored(newDeclaringType, newMember); + } private IReadOnlyCollection GetPublicMembers(Type type) {