开发者

Checking to see if a generic class is inherited from an interface

开发者 https://www.devze.com 2022-12-25 18:05 出处:网络
I\'ve got a class that inherits from an interface. That interface defines an event that I\'d like to subscribe to in the calling code. I\'ve tried a couple of things, but they all resolve to false (wh

I've got a class that inherits from an interface. That interface defines an event that I'd like to subscribe to in the calling code. I've tried a couple of things, but they all resolve to false (where I know it's true). How can I check to see if a class implements a specific interface.

Here's what I've tried (note, the object in question is a usercontrol that implements MyInterface, stored in an ar开发者_开发问答ray of controls, only some of which implement MyInterface - it is not null):

if (this.controls[index].GetType().IsSubclassOf(typeof(MyInterface)))
    ((MyInterface)this.controls[index]).Event += this.Handler;

if (this.controls[index].GetType().IsAssignableFrom(typeof(MyInterface)))
    ((MyInterface)this.controls[index]).Event += this.Handler;

if (this.controls[index].GetType() == typeof(MyInterface))
    ((MyInterface)this.controls[index]).Event += this.Handler;

All to no avail.


if (typeof(MyInterface).IsAssignableFrom(this.controls[index].GetType()))
    ((MyInterface)this.controls[index]).Event += this.Handler;

You just have the IsAssignableFrom inverted.


For your case, however, the best way to do this test is the following for performance and clarity improvements:

if (this.controls[index] is MyInterface)


I might be being dense but can't you just do:

MyInterface foo = this.controls[index] as MyInterface;
if (foo != null) { /* do stuff */ }

(and of course the real MyInterface should have a name starting with I)

0

精彩评论

暂无评论...
验证码 换一张
取 消