Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试接口上是否支持方法并调用它的最佳实践是什么?_C#_.net_Oop - Fatal编程技术网

C# 测试接口上是否支持方法并调用它的最佳实践是什么?

C# 测试接口上是否支持方法并调用它的最佳实践是什么?,c#,.net,oop,C#,.net,Oop,假设我有两个接口,它们遵循相同的函数调用序列 第一个接口上有一个额外的方法,第二个接口没有方法,因此不应调用。如何测试该方法是否受支持,然后调用它 最好将对象强制转换到接口,如果不为null,则调用该方法,还是有更好的方法?您可以使用keywork来检查您希望使用的接口的Is和object if(myObject is myInterface) { ((myInterface)myObject).myMethod(); } 这正是操作符和接口的用途 if (obj1 is MyInte

假设我有两个接口,它们遵循相同的函数调用序列

第一个接口上有一个额外的方法,第二个接口没有方法,因此不应调用。如何测试该方法是否受支持,然后调用它

最好将对象强制转换到接口,如果不为null,则调用该方法,还是有更好的方法?

您可以使用keywork来检查您希望使用的接口的Is和object

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方法。(当然,在这种情况下,首先问这个问题没有多大意义。)