Skip to content

Commit 1f79ee2

Browse files
authored
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 praeclarum#1010 Fixes praeclarum#661 Fixes praeclarum#656
1 parent 0b23275 commit 1f79ee2

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

src/SQLite.cs

+24-1
Original file line numberDiff line numberDiff line change
@@ -2469,7 +2469,7 @@ public TableMapping (Type type, CreateFlags createFlags = CreateFlags.None)
24692469
var cols = new List<Column>(members.Count);
24702470
foreach(var m in members)
24712471
{
2472-
var ignore = m.IsDefined(typeof(IgnoreAttribute), true);
2472+
var ignore = IsIgnored(type, m);
24732473
if(!ignore)
24742474
cols.Add(new Column(m, createFlags));
24752475
}
@@ -2496,6 +2496,29 @@ public TableMapping (Type type, CreateFlags createFlags = CreateFlags.None)
24962496
_insertColumns = Columns.Where (c => !c.IsAutoInc).ToArray ();
24972497
_insertOrReplaceColumns = Columns.ToArray ();
24982498
}
2499+
2500+
private bool IsIgnored(Type declaringType, MemberInfo m)
2501+
{
2502+
var attributes = m.GetCustomAttributes(typeof(IgnoreAttribute), true);
2503+
if (attributes.Any(x => x is IgnoreAttribute))
2504+
return true;
2505+
2506+
if (declaringType.BaseType == null)
2507+
return false;
2508+
2509+
var newDeclaringType = declaringType;
2510+
var newMember = m;
2511+
do
2512+
{
2513+
newDeclaringType = newDeclaringType.BaseType;
2514+
if (newDeclaringType == null)
2515+
return false;
2516+
newMember = newDeclaringType.GetMember(m.Name).FirstOrDefault();
2517+
2518+
} while (newMember == null);
2519+
2520+
return IsIgnored(newDeclaringType, newMember);
2521+
}
24992522

25002523
private IReadOnlyCollection<MemberInfo> GetPublicMembers(Type type)
25012524
{

0 commit comments

Comments
 (0)