如何调用C#方法只有它存在?

use*_*291 10 c#

这是否可能没有反射,否则反射?这在PHP中经常用于Wordpress中.

伪代码中的东西:

if (exists(object.method)) {object.method}
Run Code Online (Sandbox Code Playgroud)

要么

try {object.method} finally {...}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 22

好吧,您可以在界面中声明它,然后使用:

IFoo foo = bar as IFoo;
if (foo != null)
{
    foo.MethodInInterface();
}
Run Code Online (Sandbox Code Playgroud)

假设您可以使对象的实际类型实现接口.

否则你需要使用反射AFAIK.

(编辑:其他地方提到的动态类型也可以在.NET 4上运行,当然......但是为此捕获异常是非常讨厌的IMO.)

  • +1使用界面是最干净的方法 (2认同)

Yur*_*ich 16

您可以使用动态并捕获运行时异常:

dynamic d = 5;
try
{
    Console.WriteLine(d.FakeMethod(4));
}
catch(RuntimeBinderException)
{
    Console.WriteLine("Method doesn't exist");
}
Run Code Online (Sandbox Code Playgroud)

虽然听起来更像是一个设计问题.

免责声明
此代码不可使用,只是可以完成的示例.

  • 使用流控制的例外是讨厌的,讨厌的,NASTY. (15认同)
  • 正如杰森所说,这将是令人讨厌的 - 如果你这么做的话,表现也会很大. (4认同)
  • @ user310291:是的,这就是你想要的,就像你的医生通过砍掉你的手臂来解决你的腕管综合症是你想要的. (2认同)
  • 这就是为什么我总是如此批评SO。您回答的问题是书面的,但您只会在抱怨中抱怨和抱怨。在很多情况下,此代码没有任何问题。并非所有的航天飞机都是RT代码。通常情况下,事情需要花费一到两秒钟,而且还不错。 (2认同)

Dan*_*Tao 6

使用dynamicC#4.0中的类型,您可以执行以下操作:

dynamic obj = GetDynamicObject();
if (obj != null && obj.GetType().GetMethod("DoSomething") != null)
{
    obj.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

但是,判断类型是否首先具有方法的唯一方法是使用反射。因此上述方法并没有真正买任何东西(你还不如把MethodInfo你从哪打来得到GetMethod,只是Invoke它)。

编辑:如果您不尝试调用该方法,即使它不存在,那么Yuriy的答案可能就是您想要的。我最初的回答是对您的问题表达方式的字面回答:“ 仅在存在 C#方法的情况下如何调用它 ”。


fac*_*m42 6

使用.GetType().GetMethod()来检查它是否存在,然后.Invoke()它。

var fooBar = new FooBarClass();
var method = fooBar.GetType().GetMethod("ExistingOrNonExistingMethod");
if (method != null)
{
    method.Invoke(fooBar, new object[0]);
}
Run Code Online (Sandbox Code Playgroud)