在c#中找出类是否直接从接口继承

在c#中找出类是否直接从接口继承,c#,system.reflection,ef-core-2.0,C#,System.reflection,Ef Core 2.0,我想知道类是否直接从接口继承。类似于Type.IsSubClass但用于接口 为了 我尝试使用Type.GetInterfaces和Type.BaseType,但无法找到直接的方法来获取子接口是否为类。 typeof(IOne).IsAssignableFrom对我来说不起作用,因为它检查的是整个继承树,但这里我只想检查类是否直接从接口继承 背后的原因是efcore只审核从IAudit接口继承的实体,而不是审核从被审核实体继承的任何实体 另一个解决方案是创建一个属性,而不是IAudit,但是如果

我想知道类是否直接从接口继承。类似于
Type.IsSubClass
但用于接口

为了

我尝试使用
Type.GetInterfaces
和Type.BaseType,但无法找到直接的方法来获取子接口是否为类。
typeof(IOne).IsAssignableFrom对我来说不起作用,因为它检查的是整个继承树,但这里我只想检查类是否直接从接口继承

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


另一个解决方案是创建一个属性,而不是
IAudit
,但是如果我能用一个接口来解决这个问题,我的生活会轻松得多这对你有用吗

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
,那么它必须是实现类,因此答案为true

如果类型实现了
t2
,有一个基类,而该基类没有实现
t2
,那么答案是
true

否则答案是错误的

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


但是:我不确定这是否是您想要遵循的设计路线。它似乎有点黑。我同意/u/Damien_不信者的上述评论。

我似乎记得这些信息并不容易获得,您还需要决定另一种类型:
类二加:一,IOne{}
谢谢,但我有一些类已经从其他类继承,这样我就不能为它们添加审计我的观点是:如果你有一个实现接口的基类,你说你想审计这个类,但是任何从基类派生的类,你都不想审计它们。那么,难道你不能简单地检测到父类实现了相同的接口,这就是你的信号吗?小警告:类不会“从接口继承”,它们实现了一个接口在您的示例中,
Two
仍然通过
One
实现接口
IOne
不确定这种区分是否可用。如果您需要以这种方式区分类型,则这似乎是一种非常脆弱的类型设计。你确定你的建模正确吗?不确定它能检测到接口的重新实现。。。喜欢,但我甚至不确定是否有可能做到。。。这些信息(虽然存在于已编译的程序集中)似乎被.NET隐藏了
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)));
        }
    }
}