2011-12-18 3 views
3

Пусть у меня есть класс, какКак определить класс имеет реализовывать определенный интерфейс или нет

interface ISampleInterface 
{ 
    void SampleMethod(); 
} 

class ImplementationClass : ISampleInterface 
{ 
// Explicit interface member implementation: 
void ISampleInterface.SampleMethod() 
{ 
    // Method implementation. 
} 

static void Main() 
{ 
    // Declare an interface instance. 
    ISampleInterface obj = new ImplementationClass(); 

    // Call the member. 
    obj.SampleMethod(); 
} 
} 

Из основного метода, как я мог определить, что ImplementationClass класс реализует ISampleInterface до написания кода, как показано ниже

SampleInterface obj = new ImplementationClass(); 
obj.SampleMethod(); 

есть если возможно .... обсудите пожалуйста. Благодарю.

+0

Ну если вам нужно знать, что, по-видимому, у вас есть что-то * во время выполнения - есть ли у вас объект или просто имя типа или что? –

+0

Erm посмотрите код или метаданные для класса –

+1

@JonSkeet, может быть, я ошибаюсь, но я думал, что OP спрашивает, как определить его во время разработки. –

ответ

4

Вы можете использовать отражение:

bool result = typeof(ISampleInterface).IsAssignableFrom(typeof(ImplementationClass)); 
3
public static bool IsImplementationOf(this Type checkMe, Type forMe) 
    { 
     foreach (Type iface in checkMe.GetInterfaces()) 
     { 
      if (iface == forMe) 
       return true; 
     } 

     return false; 
    } 

Вызов его с помощью:

if (obj.GetType().IsImplementationOf(typeof(SampleInterface))) 
    Console.WriteLine("obj implements SampleInterface"); 
11

is keyword является хорошим решением для этого. Вы можете проверить, является ли объект интерфейсом или другим классом. Вы бы сделать что-то вроде этого:

if (obj is ISampleInterface) 
{ 
    //Yes, obj is compatible with ISampleInterface 
} 

Если вы не имеете экземпляр объекта во время выполнения, но Type, вы можете использовать IsAssignableFrom:

Type type = typeof(ISampleInterface); 
var isassignable = type.IsAssignableFrom(otherType); 
1

Когда вы жестко программируете класс реализации, вы знаете, какие интерфейсы он реализует, поэтому вы можете просто посмотреть исходный код или документацию, чтобы узнать, какие интерфейсы ac лайв.

Если вы получаете объект неизвестного типа, то есть несколько способов, чтобы проверить для реализации интерфейса:

void Test1(object a) { 
    var x = a as IMyInterface; 
    if (x != null) { 
     // x implements IMyInterface, you can call SampleMethod 
    } 
} 

void Test2(object a) { 
    if (a is IMyInterface) { 
     // a implements IMyInterface 
     ((IMyInterface)a).SampleMethod(); 
    } 
} 
1

Один шаблон (рекомендованный FxCop) является

SampleInterface i = myObject as SampleInterface; 
if (i != null) { 
    // MyObject implements SampleInterface 
}