Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# - Fatal编程技术网

如何仅在C#方法存在时调用它?

如何仅在C#方法存在时调用它?,c#,C#,这在没有反射的情况下是可能的吗?这在PHP中非常常用,就像在Wordpress中一样 伪代码: if (exists(object.method)) {object.method} 或 您可以在接口中声明它,然后使用: IFoo foo = bar as IFoo; if (foo != null) { foo.MethodInInterface(); } 这假设您可以使对象的实际类型实现接口 否则你就需要使用反射了 (编辑:当然,其他地方提到的动态键入也适用于.NET4……但在我看

这在没有反射的情况下是可能的吗?这在PHP中非常常用,就像在Wordpress中一样

伪代码:

if (exists(object.method)) {object.method}


您可以在接口中声明它,然后使用:

IFoo foo = bar as IFoo;
if (foo != null)
{
    foo.MethodInInterface();
}
这假设您可以使对象的实际类型实现接口

否则你就需要使用反射了


(编辑:当然,其他地方提到的动态键入也适用于.NET4……但在我看来,捕捉到一个异常是相当麻烦的。)

您应该首先修改existance<代码>方法信息[]myArrayMethodInfo=myType.GetMethods()

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

dynamic d = 5;
try
{
    Console.WriteLine(d.FakeMethod(4));
}
catch(RuntimeBinderException)
{
    Console.WriteLine("Method doesn't exist");
}
虽然这听起来更像是一个设计问题

免责声明

此代码不是供使用的,只是一个可以执行此操作的示例。

使用C#4.0中的
动态
类型,可以执行以下操作:

dynamic obj = GetDynamicObject();
if (obj != null && obj.GetType().GetMethod("DoSomething") != null)
{
    obj.DoSomething();
}
但是,首先判断一个类型是否有方法的唯一方法是使用反射;因此,上述方法并没有真正为您带来任何好处(您可以使用调用
GetMethod
得到的
MethodInfo
并调用它)


编辑:如果您愿意尝试调用该方法,即使该方法不存在,那么这可能就是您正在寻找的。我最初的回答是对你问题措辞的字面回答:“只有当C方法存在时,如何调用它””

我在寻找相同的答案时遇到了这个问题,但不喜欢任何解决方案

这是我的:

//Invoke the refresh method if the datasource contains it
if (this.DataSource.GetType().GetMethod("Refresh") != null)
     this.DataSource.GetType().GetMethod("Refresh").Invoke(this.DataSource, new object[] { });
使用
.GetType().GetMethod()
检查它是否存在,然后使用
.Invoke()
检查它

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

“仅当它存在时”是什么意思?即使使用反射,您也必须考虑方法的原型:
intfoo(字符串条)
double Foo(intbar,IDictionary qux)
不同。您是否在寻找部分方法?检查您的MethodInfo是否为空object@AndrewGrimm即使使用null传播运算符,也会出现编译时错误。所有提供的答案至今仍然适用。因此,我发现过时的声明不支持meritA可能的性能优化,如果这不可能,将使用反射一次,并生成一个动态方法来优化未来的调用。在我想要使用的上下文中太重了:如果我必须为每个方法创建一个接口,大约需要50个方法…这将是.net的方法。反射答案也是一种合理的方法,但与使用接口相比,它会带来显著的性能损失。PHP确实允许这样的动态方法,但我同意user166390的观点,这属于试图将不同语言的特性硬塞进另一种语言的范畴。动态方法也“有效”,但我同意,这似乎非常困难,并且会带来性能损失。使用异常进行流控制是非常糟糕、非常糟糕、非常糟糕的。正如Jason所说,这将非常糟糕-如果你经常这样做,性能损失也可能非常大。@user310291:是的,这就是你想要的,就像你的医生通过砍掉你的手臂来解决你的腕管综合症一样。如果你们认为这段代码的教育目的不值得在别人的代码中看到,我可以删除它。这就是为什么我总是如此挑剔的原因。你以书面形式回答问题,除了抱怨和呻吟,你什么也得不到。在很多情况下,这段代码没有什么问题。并非所有的东西都是航天飞机的RT代码。通常情况下,事情需要一秒钟或三秒钟,这很好。如果我想避免动态,或者我没有维护
FooBarClass
的源代码,并且知道它将来可能会改变,不再包含我正在寻找的方法,我个人会使用这个例子。
var fooBar = new FooBarClass();
var method = fooBar.GetType().GetMethod("ExistingOrNonExistingMethod");
if (method != null)
{
    method.Invoke(fooBar, new object[0]);
}