Узнайте в c #, наследует ли класс напрямую от интерфейса - PullRequest
0 голосов
/ 25 мая 2018

Я хочу знать, наследует ли класс напрямую от интерфейса или нет.что-то вроде Type.IsSubClass, но для интерфейса.

для

interface IOne{}
class Zero{}
class One:IOne{}
class Two:One{}
class Three: Zero, IOne{}

type(Three).IsSubInterface(IOne)  //should return true
type(Two).IsSubInterface(IOne)    //should return false

Я пытался поиграть с Type.GetInterfaces и Type.BaseType, но не смог выяснить прямой способ получить, если SubInterfaceэто класс или нет.typeof(IOne).IsAssignableFrom не работает для меня, так как он проверяет все дерево наследования, но здесь я просто хочу проверить, наследует ли класс напрямую от интерфейса или нет.

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

другое решение, а не IAudit я думал, что создать атрибут, но моя жизнь будет намного проще, если я смогу решить это с помощью интерфейса

1 Ответ

0 голосов
/ 25 мая 2018

Это работает для вас?

using System;

namespace Demo
{
    interface IOne { }
    class Zero { }
    class One : IOne { }
    class Two : One { }
    class Three : Zero, IOne { }

    public static class TypeExt
    {
        public static bool IsSubInterface(this Type t1, Type t2)
        {
            if (!t2.IsAssignableFrom(t1))
                return false;

            if (t1.BaseType == null)
                return true;

            return !t2.IsAssignableFrom(t1.BaseType);
        }
    }

    class Program
    {
        static void Main()
        {
            Console.WriteLine(typeof(Three).IsSubInterface(typeof(IOne)));
            Console.WriteLine(typeof(Two).IsSubInterface(typeof(IOne)));
        }
    }
}

Если тип не реализует t2, то ответ всегда будет false.

Если тип не имеет базового класса, нореализует t2, тогда это должен быть реализующий класс, поэтому ответ верен.

Если тип реализует t2, имеет базовый класс, и этот базовый класс не реализует t2, тогдаответ true.

В противном случае ответ ложный.

Это может работать не во всех случаях;вопрос: работает ли он для тех случаев, для которых вы хотите, чтобы он работал?

ОДНАКО: Я не уверен, что это проектный маршрут, по которому вы хотите пойти.Это кажется немного хакерским.Я согласен с комментарием / u / Damien_The_Unbeliever выше.

...