Ответ 1
При вызове метода "GetMembers" для получения членов Type вы можете указать "DeclaredOnly" в флаге привязки.
Из-за этой проблемы здесь, я пытаюсь написать пользовательский JsonConverter, который обрабатывает случаи, когда вы подклассифицируете список или коллекцию, затем добавьте к нему дополнительные свойства. Таким образом, одним из подходов было бы игнорировать все свойства базового класса и только сериализовать их в определенном классе. (Технически это не сработает, потому что если вы подклассифицируете этот подкласс, вы нарушите сериализацию, но это заставило меня задуматься...)
Возможно ли это с помощью рефлексии (хорошо я знаю, что ответ "да", потому что Reflector делает именно это, но я не знаю, как) получить только те члены, которые определены в самом классе, а не те, которые были по наследству? Например...
public class MyBaseClass
{
public string BaseProp1 { get; set; }
public string BaseProp2 { get; set; }
}
public class MySubClass : MyBaseClass
{
public string SubProp1 { get; set; }
public string SubProp2 { get; set; }
}
В этом случае я хочу задуматься о MySubClass
и получить только SubProp1
и SubProp2
, игнорируя BaseProp1
и BaseProp2
. Так что может быть, как это сделать?
M
При вызове метода "GetMembers" для получения членов Type вы можете указать "DeclaredOnly" в флаге привязки.
Вам нужно выбрать всех членов в MySubClass
и сохранить только те, где DeclaringType == MySubClass
.
С LINQ, что-то вроде этого (overkill):
MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));
Или с перегрузкой GetMembers()
:
MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
Многие функции отражения принимают параметр типа BindingFlags. Это перечисление включает значение DeclaredOnly:
Указывает, что должны учитываться только члены, объявленные на уровне иерархии поставляемого типа. Унаследованные члены не учитываются.
MemberInfo.DeclaringType
должен делать то, что вам нужно. Чтобы получить члены, которые непосредственно определены в типе X, фильтруйте члены с помощью DeclaringType == typeof(X)
.