我需要某种方法来标记基接口,并确定一个类是实现了基接口还是它的派生接口。c#不允许有"抽象接口"。在c#中有办法做到这一点吗?
public interface IBaseFoo
{
void BaseMethod();
}
public interface IFoo : IBaseFoo
{
void FooMethod();
}
public class Base
{
}
public class A : Base, IFoo
{
}
public class B : Base, IBaseFoo
{
}
现在,在下面的方法中,我需要检查typeCls
是否实现了IFoo
或IBaseFoo
,而没有显式指定类型。我需要一种方法来标记基本接口并在方法中识别它。(即:如果c#允许有抽象接口,我可以检查typeClas
接口的IsAbstract
属性)
public bool IsBaseFooImplemented<T>(T typeCls) where T : Base
{
// Here I need to check if the typeCls is implemented the IFoo or IBaseFoo
}
因为IFoo : IBaseFoo
,每个实现IFoo
的类也实现了IBaseFoo
。但不是反过来,所以您可以简单地检查typeCls is IFoo
.
请注意,基于实现的接口更改行为通常是一种设计气味,它首先绕过了接口的使用。
//somewhere define
static List<IBaseFoo> list = new List<IBaseFoo>();
public class A : Base, IFoo
{
public A()
{
YourClass.list.add(this);
}
}
public class B : Base, IBaseFoo
{
public B()
{
YourClass.list.add(this);
}
}
//然后你可以检查一个类是否为IFoo。
public bool IsBaseFooImplemented<T>(T typeCls) where T : Base
{
foreach(var c in list )
{
if(typeof(c) == typeCls) return true;
}
return false;
}
我没有测试代码,但它应该工作