2016-09-05 13 views
1

Мне нужно каким-то образом пометить базовые интерфейсы и определить, реализовал ли класс базовый интерфейс или его производный интерфейс. C# не позволяет иметь «абстрактный интерфейс». Есть ли способ сделать это в 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 без явного указания типов. Мне нужен способ отметить базовый интерфейс и определить его в методе. (То есть: если с # допускаются имеющим абстрактный интерфейс, я мог бы проверить, если 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

Это немного пахнет. Вы говорите, что вам «нужно», чтобы проверить это - зачем вам нужно проверять? Что вы пытаетесь достичь, что, по вашему мнению, стандартный SOLID OO не даст вам? Потому что вы собираетесь нарушить/закрыть, поэтому тщательно подумайте, прежде чем вы это сделаете. –

ответ

3

Поскольку IFoo : IBaseFoo, каждый класс, реализующий IFoo также реализует IBaseFoo. Но не наоборот, так что вы можете просто проверить, typeCls is IFoo.

Обратите внимание, что изменение поведения на основе реализованных интерфейсов обычно представляет собой запах дизайна, который в обход использования для интерфейсов в первую очередь.

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

Я не тестировал код, но он должен работать.

Смежные вопросы