Можно ли в .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


person Mark A. Donohoe    schedule 04.05.2011    source источник


Ответы (4)


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

person Ankur    schedule 04.05.2011
comment
Мне нужно было использовать... type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance) - person garyking11188; 27.04.2021

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

С LINQ что-то вроде этого (излишнее):

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

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

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
person user703016    schedule 04.05.2011

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

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

person Damien_The_Unbeliever    schedule 04.05.2011

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

person Richard    schedule 04.05.2011
comment
Спасибо, это то, что мне нужно. Я использовал BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly; но все же каким-то образом унаследованные методы объекта проходили, пока я не добавил ваше исправление. Затем я заметил, что это было не первое исправление такого рода, которое я использовал. Чтобы пропустить методы доступа к свойству get_XXX set_XXX, я бы хотел, если (MethodInfo.SpecialName) continue; - person FocusedWolf; 05.03.2018