C# 测试接口上是否支持方法并调用它的最佳实践是什么?
假设我有两个接口,它们遵循相同的函数调用序列 第一个接口上有一个额外的方法,第二个接口没有方法,因此不应调用。如何测试该方法是否受支持,然后调用它 最好将对象强制转换到接口,如果不为null,则调用该方法,还是有更好的方法?您可以使用keywork来检查您希望使用的接口的Is和objectC# 测试接口上是否支持方法并调用它的最佳实践是什么?,c#,.net,oop,C#,.net,Oop,假设我有两个接口,它们遵循相同的函数调用序列 第一个接口上有一个额外的方法,第二个接口没有方法,因此不应调用。如何测试该方法是否受支持,然后调用它 最好将对象强制转换到接口,如果不为null,则调用该方法,还是有更好的方法?您可以使用keywork来检查您希望使用的接口的Is和object if(myObject is myInterface) { ((myInterface)myObject).myMethod(); } 这正是操作符和接口的用途 if (obj1 is MyInte
if(myObject is myInterface)
{
((myInterface)myObject).myMethod();
}
这正是
操作符和接口的用途
if (obj1 is MyInterface1)
(obj1 as MyInterface1).Method1();
使用is
的另一种方法是利用as
在强制转换失败时返回null
的事实:
var casted = obj as MyInterface1;
if (casted != null)
casted.Method1();
我所知道的最佳实践是:
myInterface myCastedObject = myObject as myInterface;
if(myCastedObject != null)
{
myCastedObject.myMethod();
}
如果允许扩展接口从第一个接口继承,则可以创建两个方法,它们可以显式调用它们应该调用的内容,而无需重复代码
public interface IFirst
{ ... }
public interface ISecond : IFirst
{ ... }
public void DoWork(IFirst obj) {...}
public void DoWork(ISecond obj)
{
DoWork(obj as IFirst);
/* ISecond calls */
}
在此模型中,您没有检查类型。您是否检查使用这两个接口的代码中的类型?不确定我是否理解您的意思。但这会检查类型两次。使用as
加上空值检查可以避免这种情况。@phoog:你是对的,但除非有充分的理由,否则我不会进行微优化。@Henk-清晰度不是“微优化”。@RitchMelton和as+null方法的清晰度在哪里?@Henk-虽然你的示例很小,但在对象被多次作用的普通方法中,一次又一次地强制转换接口会给方法的意图增加噪音。使用as将其强制转换为本地类型可使代码更易于阅读。当显式实现接口或myObject 1为基类型时,这将不起作用。@Baboon除非myObject的静态类型具有公共myMethod方法。(当然,在这种情况下,首先问这个问题没有多大意义。)