Sency
Sency

Reputation: 2878

Base interface in c#

I need some sort of way to mark base interfaces and identify if a class implemented the base interface or its derived interface. c# doesn't allow having 'abstract interface'. Is there any way to do this in 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
{

}

Now in the following method I need to check if the typeCls is implemented the IFoo or IBaseFoo without explicitly specifying types. I need sort of a way to mark the base interface and identify it in the method. (ie: if c# allowed having abstract interface, I could have check if IsAbstract property of interfaces of typeClas)

public bool IsBaseFooImplemented<T>(T typeCls) where T : Base
{
     // Here I need to check if the typeCls is implemented the IFoo or IBaseFoo
}

Upvotes: 1

Views: 141

Answers (2)

FreeMan
FreeMan

Reputation: 1457

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

//then you can check if a class is IFoo or not.

public bool IsBaseFooImplemented<T>(T typeCls) where T : Base
{
     foreach(var c in list )
     {
         if(typeof(c) == typeCls) return true;
     }
     return false;
}

I have not tested the code but it should work.

Upvotes: 0

CodeCaster
CodeCaster

Reputation: 151738

Because IFoo : IBaseFoo, every class implementing IFoo also implements IBaseFoo. But not the other way around, so you can simply check whether typeCls is IFoo.

Do note that changing behavior based on implemented interfaces generally is a design smell that bypasses the use for interfaces in the first place.

Upvotes: 3

Related Questions