如果一个类直接从接口继承,请在c#中找到

时间:2018-05-25 07:39:16

标签: c# system.reflection ef-core-2.0

我想知道一个类是否直接从接口继承。像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对我来说不起作用,因为它检查整个继承树,但在这里我只想检查一个类是否直接从接口继承。

背后的原因是efcore只审核从IAudit接口继承的实体,而不是从审计实体继承的任何实体。

另一个解决方案而不是IAudit我认为是创建一个属性,但如果我可以通过界面解决这个问题,我的生活会更容易

1 个答案:

答案 0 :(得分:2)

这对你有用吗?

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

否则答案是错误的。

这可能不适用于所有情况;问题是:它是否适用于您希望它适用的案例?

但是:我不确定这是你想要失败的设计路线。看起来有点hacky。我同意/ u / Damien_The_Unbeliever上面的评论。