在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)));
}
}
}