Answers:
if (object is IBlah)
要么
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
如果您在编译时知道接口类型并具有要测试的类型的实例,则使用is
or as
运算符是正确的方法。似乎没有人提到的一件事是Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
我认为这比查看返回的数组要整洁得多,GetInterfaces
并且具有为类工作的优点。
typeof(IList).IsAssignableFrom(someType)
,而不使用<>
。
对于实例:
if (obj is IMyInterface) {}
对于班级:
检查是否typeof(MyClass).GetInterfaces()
包含接口。
如果要在检查之后使用类型转换的对象:
从C#7.0开始:
if (obj is IMyInterface myObj)
这和
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
请参见.NET Docs:与is
#类型模式匹配的模式
最近,我尝试使用安德鲁·肯南(Andrew Kennan)的答案,由于某种原因,它对我不起作用。我改用了它,它起作用了(注意:可能需要编写名称空间)。
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
我遇到了将变量传递给方法的情况,但不确定是接口还是对象。
目标是:
我做到了以下几点:
if(!typeof(T).IsClass)
{
// If your constructor needs arguments...
object[] args = new object[] { my_constructor_param };
return (T)Activator.CreateInstance(typeof(T), args, null);
}
else
return default(T);