c#中的基接口

时间:2016-09-05 11:06:45

标签: c# reflection interface

我需要某种方式来标记基接口并识别类是否实现了基接口或其派生接口。 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是否已实现IFooIBaseFoo而未明确指定类型。我需要一种方法来标记基本接口并在方法中识别它。 (即:如果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
}

2 个答案:

答案 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;
}

我没有测试过代码,但应该可以使用。