Как использовать отражение, чтобы определить, реализует ли класс локально интерфейс? - PullRequest
1 голос
/ 16 февраля 2011

Проблема в том, что Type.GetInterfaces () возвращает все интерфейсы, которые реализует класс, включая любые интерфейсы, которые определены / реализованы унаследованными базовыми классами.Я сталкиваюсь с проблемами, когда пытаюсь выяснить только те интерфейсы, на которые класс локально ссылается / реализует (исключая любые интерфейсы, на которые ссылаются / определяют базовый класс).

Я хочу сделать что-то подобноев type.GetProperties () , который может принимать BindingFlags , поэтому следующий код получит все открытые / закрытые свойства, объявленные внутри ссылочного типа (и все свойства, объявленные в базовых классах).исключены).

type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)

Я пробовал следующее, но это не удается, поскольку ".DeclaringType" всегда равен нулю.

foreach (var implementedInterface in type.GetInterfaces())
{
    if (implementedInterface.DeclaringType == type)
    {
        locallyDefinedInterfaces.Add(implementedInterface);
    }
}

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

Не можете ли вы заполнить коллекцию всеми интерфейсами, которые она определяет.Затем, для каждого класса, начиная с того, из которого происходит ваш целевой класс, получите все интерфейсы, которые реализует , которые реализует , удаляя их из списка по мере продвижения.Повторяйте и промывайте, пока у вас не останется больше базовых классов.Все, что остается в вашем списке, - это интерфейсы, реализованные исключительно вашим исходным классом.

Примечание. Вполне возможно, есть более эффективные способы сделать это, это всего лишь предложение.

1 голос
/ 16 февраля 2011

Смотрите здесь:

http://www.clariusconsulting.net/blogs/kzu/archive/2010/12/03/Howtoinspectatypeinheritancetreeproperly.aspx

Это сообщение от гениального Даниеля Каззулино.

0 голосов
/ 16 февраля 2011

Причина, по которой объявленный тип является нулевым, вероятно, потому, что он является нулевым ... (поскольку интерфейс не объявлен внутри какого-либо типа).Просто понимание

0 голосов
/ 16 февраля 2011

Как насчет использования оператора is для проверки того, принадлежит ли класс к этому типу.например,


class Program
    {
        static void Main(string[] args)
        {
            MyClass c = new MyClass();
            MyClass1 c2 = new MyClass1();

            var b = c is IInterface;
            Console.WriteLine(b); //False
            Console.WriteLine(c2 is IInterface); //True
            Console.ReadKey();
        }
    }

    class MyClass
    {

    }
    class MyClass1 : IInterface
    {

    }
    interface IInterface
    {

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