Test if object implements interface
如果一个对象在C语言中实现了一个给定的接口,那么最简单的测试方法是什么?(回答这个问题在Java中)
或
1 2 3
| IBlah myTest = originalObject as IBlah
if (myTest != null) |
- +1第二个更好,因为你可能最终需要在第一个之后施法,因此给你两个施法("是",然后是一个明确的施法)。用第二种方法,你只投一次。
- @安德鲁+1;再次链接到朱利安?M?巴克纳尔(Julian M Bucknall)的经典双铸反模式博客帖子。
- 在第一种情况下,优化可能不会让你投两次?
- @Joreen,如果你使用的是一个不能使用"as"的结构,那么这个链接会漏掉一个点,因为它不会包含一个空值,"as"试图返回这个值,在这种情况下,你必须通过一个可以为空的类,比如in t?但如果您只在接口级别工作,因为它们始终是引用类型,则不是问题。
- @杰伦:我认为,在这里,表演不是一个有力的论据。可能再次链接到过早优化反模式文章。
- 第二种方法在C 6.0中具有新的优势。如果原始对象是IBlah,(originalObject as IBlah)?.FooProperty将返回FooProperty,否则返回空值。如果您只需要从类中访问一个属性,那么可以使用一个行程序访问该属性。不利的是,如果您在开发中不小心,那么拥有这样的多行就太容易了。
- 自C 6.0:if (object is IBlah iblah) { iblah.SomeMethod(); }起
- 为了倡导第一种方法,它对LINQ非常友好,用于过滤ala.list.select(e=>e是iblah)
- 自C 7:IBlah myListTest= originalObject as IBlah ?? some_code起。一些代码可以包括以下任何一个null或throw new ArgumentNullException("originalObject")或new List。
- 在没有定义接口的情况下,这不适用于通用接口,即object is IBlah<>不编译。对于这个问题,安德鲁斯的回答更有效。
- @Knelis,您是否有文档支持C 6中的模式匹配工作?微软关于这一主题的文档表明它是C 7和C 7,而不是6。
- @穆罕默德·达布杜·拉希姆,你说得对。是C 7.0。
- 当接口类是泛型时,如何工作?但你不知道它的类型。
使用is或as算子是正确的路,如果你知道在编译的时间和类型的接口有一个实例,你的类型的检测。在其他的东西似乎是一个有Type.IsAssignableFrom提到:
1 2 3
| if( typeof(IMyInterface ).IsAssignableFrom(someOtherType ) )
{
} |
我认为这是一neater比多,通过对阵列GetInterfaces归侨和有优势的是营运类井。
- 我试图确定一个类型是否实现了IList的一些实例化。我使用的是"typeof(ilist<>).isassignablefrom(sometype)",但这不起作用。
- 你最好再问一个问题。如果someType是列表元素的类型,则可能需要type of(ilist<>)。如果某个类型是列表类型,则应查看type.getGenericArguments和type.getGenerictypedefinition。
- 我用这个在插件系统中进行类型检查。它可以用于对象实例尚不存在的情况。但我使用这种风格和罗伯特的风格,这取决于我在做什么,所以我对两种方式都投了赞成票。
- 这是一个旧的评论,但要回答@steenreem的问题,使用typeof(IList).IsAssignableFrom(someType),而不使用<>。
- 此方法甚至可以与转换运算符一起使用,如果涉及类型转换器
的示例:
1
| if (obj is IMyInterface ) {} |
为类:
如果typeof(MyClass).GetInterfaces()检查包含的接口。
- if(array.indexof(typeof(myclass.getInterfaces(),typeof(imyinterface))!=-1)……}
- 或:if(typeof(myclass).getInterfaces().包含(typeof(imyinterf&zwnj;&8203;ace)))…
在回答andrewkennan变化在线"的第一端上使用的是目前在运行时类型:
1 2 3 4
| if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
} |
如果你想使用typecasted对象后的检查:由于C:# 7.0
1
| if (obj is IMyInterface myObj ) |
这是相同的
1 2
| IMyInterface myObj = obj as IMyInterface;
if (myObj != null) |
NET的文档:国有企业与is#型模式,模式匹配
这是一个很好的答案的帖子。
1 2 3
| public interface IMyInterface {}
public class MyType : IMyInterface {} |
这是一个简单的示例:
或
1
| typeof(MyType ).GetInterfaces().Contains(typeof(IMyInterface )) |
此外,测试使用的"是"),你可以装饰你的方法对确保通过实施特定的变量,它的操作系统的界面,如:
1 2 3 4
| public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
} |
我不知道这是一个版本的.NET实现的操作系统中,它可能不工作,在您的版本。
- .NET 2.0添加了泛型。
- 这是这个线程中唯一的编译时检查,谢谢。
我是怎么工作的:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
最近我想利用安德鲁凯南的回答和它是不是为我工作的一些原因。我用这个和它的工作。(注:可能需要在写作中的)。
1
| if (typeof(someObject ).GetInterface("MyNamespace.IMyInterface") != null) |
- 如果你走这条路,我不喜欢魔法字符串,所以我至少把它改为typeof(imyinterface).name而不是"mynamespace.imyinterface"。有助于将重构证明命名为奖励。
我有一个可变情况传递到方法和是不是知道这是要去是一个接口或一个对象。
的目标分别为:
如果一个项目是一个基于对象的接口,instantiate接口接口是与作为参数的构造函数的调用。
如果该项目是一个对象,返回null。由于我是一constuctor expecting接口和I didn’t want the码的坦克。
实现这一具有以下:
1 2 3 4 5 6 7 8
| 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 ); |
我用的
Assert.IsTrue(myObject is ImyInterface);
如果在我的单元测试的测试对象,这是一个试验,如果我有imyinterface接口实现的。
这应该工作。
1
| MyInstace.GetType().GetInterfaces(); |
不太好。
(或甚至不甚优雅):
1
| if (obj .GetType() == typeof(IMyInterface )) |
- 检查是否与typeof(imyinterface)相等将始终失败。投反对票。
- 正确的。没有接口实例。