我想知道一个类是否直接从接口继承。像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
我认为是创建一个属性,但如果我可以通过界面解决这个问题,我的生活会更容易
答案 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上面的评论。