Получить все статические свойства из класса - PullRequest
0 голосов
/ 22 марта 2019

Я знаю, что есть много подобных вопросов, но я не смог найти ответа на то, что я пытаюсь сделать.

Учитывая следующий абстрактный класс:

public abstract class TestBase
{
    public static ITest Test => Container.Resolve<ITest>();
    public static ITest1 Test1 => Container.Resolve<ITest1>();
    public static ITest2 Test2 => Container.Resolve<ITest2>();
    public static ITest3 Test3 => Container.Resolve<ITest3>();
}

Я пытаюсь получить все свойства, которые наследуются от интерфейса IDummy, как это:

    var members = typeof(TestBase).GetMembers(BindingFlags.Static | BindingFlags.Public)
        .Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true);

, носписок пуст.Без добавления предложения where ".Where(f => f.GetType().IsAssignableFrom(typeof(IDummy)) == true)" я получаю все результаты, включая методы получения свойств.

Возможно, это что-то тривиальное, но, поскольку я не очень знаком с рефлексией, я не могу понять, что я делаю неправильно.

1 Ответ

3 голосов
/ 22 марта 2019

Что вы получаете от GetMembers - это MemberInfo экземпляров (или, для полей, FieldInfo экземпляров).Следовательно, вы не можете проверить эти объекты напрямую на предмет их назначения из IDummy.

. Что вы действительно хотите сделать, так это отфильтровать объекты MemberInfo для полей, а затем проверить свойство FieldType каждого из этих объектов:

var members = typeof(TestBase).GetMembers(BindingFlags.Static | BindingFlags.Public)
    .OfType<FieldInfo>()
    .Where(f => typeof(IDummy).IsAssignableFrom(f.FieldType));

Также обратите внимание, что я перевернул тему и объект вызова IsAssignableFrom, как это также предлагается в комментарии Патрика .


Как я только что заметил, ваш пример показывает свойства , а не поля .Общая техника та же, хотя;просто используйте PropertyInfo и PropertyType вместо FieldInfo и FieldType соответственно.

Наконец, вместо того, чтобы фильтровать PropertyInfo самостоятельно, вы также можете использовать одну из перегрузок GetProperties метод напрямую.

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