测试对象是否实现接口

Jos*_*ers 342 c# reflection interface

如果对象在C#中实现给定接口,最简单的测试方法是什么?(用Java回答这个问题 )

Rob*_*rth 549

if (object is IBlah)
Run Code Online (Sandbox Code Playgroud)

要么

IBlah myTest = originalObject as IBlah

if (myTest != null)
Run Code Online (Sandbox Code Playgroud)

  • +1第二个更好,因为你可能最终需要使用第一个投射,从而给你两个演员阵容("是",然后是一个显式演员).使用第二种方法,您只需施放一次. (85认同)
  • @Andrew:+1; 时间再次[链接](http://www.boyet.com/Articles/DoubleCastingAntiPattern.html)到[Julian M Bucknall]的经典Double-Casting AntiPattern博客文章(http://www.boyet.com) . (49认同)
  • 自C#6.0起:`if(object is IBlah iblah){iblah.SomeMethod(); }` (40认同)

And*_*nan 211

如果在编译时知道接口类型并且具有要测试的类型的实例,则使用isas运算符是正确的方法.其他人似乎没有提到的是Type.IsAssignableFrom:

if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Run Code Online (Sandbox Code Playgroud)

我认为这比查看返回的数组要简洁得多,GetInterfaces并且具有为类工作的优势.

  • 你可能最好在另一个问题中问这个问题.如果someType是列表元素的类型,则可能需要typeof(IList <>).MakeGenericType(someType).如果someType是列表类型,则应查看Type.GetGenericArguments和Type.GetGenericTypeDefinition. (3认同)

Rau*_*otz 21

对于实例:

if (obj is IMyInterface) {}
Run Code Online (Sandbox Code Playgroud)

对于班级:

检查是否typeof(MyClass).GetInterfaces()包含接口.

  • 或:if(typeof(MyClass).GetInterfaces().Contains(typeof(IMyInterface))){...} (2认同)

fam*_*kin 15

关于@AndrewKennan的答案的一个变体我最近最终用于运行时获得的类型:

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*der 12

如果要在检查后使用类型转换对象:
从C#7.0开始:

if (obj is IMyInterface myObj)
Run Code Online (Sandbox Code Playgroud)

这是一样的

IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Run Code Online (Sandbox Code Playgroud)

请参阅.NET Docs:使用#Type模式匹配is模式


eli*_*etm 5

这个帖子是一个很好的答案。

public interface IMyInterface {}

public class MyType : IMyInterface {}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的示例:

typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
Run Code Online (Sandbox Code Playgroud)

要么

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
Run Code Online (Sandbox Code Playgroud)