В .NET вы можете использовать отражение, чтобы получить все не наследуемые методы класса? - PullRequest
18 голосов
/ 04 мая 2011

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

Ответы [ 4 ]

27 голосов
/ 04 мая 2011

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

10 голосов
/ 04 мая 2011

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

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

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

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

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
3 голосов
/ 04 мая 2011

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

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

1 голос
/ 04 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...