我需要某种方式来标记基接口并识别类是否实现了基接口或其派生接口。 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#允许使用抽象接口,我可以检查IsAbstract
接口的typeClas
属性
public bool IsBaseFooImplemented<T>(T typeCls) where T : Base
{
// Here I need to check if the typeCls is implemented the IFoo or IBaseFoo
}
答案 0 :(得分:3)
由于IFoo : IBaseFoo
,每个实施IFoo
的类也会实现IBaseFoo
。但不是相反,所以你只需检查typeCls is IFoo
。
请注意,基于已实现的界面改变行为通常是一种设计气味,它首先绕过了接口的使用。
答案 1 :(得分:0)
//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;
}
我没有测试过代码,但应该可以使用。