В .NET вы можете использовать рефлексию для получения всех не унаследованных методов класса?

Из-за этой проблемы здесь, я пытаюсь написать пользовательский 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

Ответы

Ответ 1

При вызове метода "GetMembers" для получения членов Type вы можете указать "DeclaredOnly" в флаге привязки.

Ответ 2

Вам нужно выбрать всех членов в MySubClass и сохранить только те, где DeclaringType == MySubClass.

С LINQ, что-то вроде этого (overkill):

MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));

Или с перегрузкой GetMembers():

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);

Ответ 3

Многие функции отражения принимают параметр типа BindingFlags. Это перечисление включает значение DeclaredOnly:

Указывает, что должны учитываться только члены, объявленные на уровне иерархии поставляемого типа. Унаследованные члены не учитываются.

Ответ 4

MemberInfo.DeclaringType должен делать то, что вам нужно. Чтобы получить члены, которые непосредственно определены в типе X, фильтруйте члены с помощью DeclaringType == typeof(X).