这是否可能没有反射,否则反射?这在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.)
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)
虽然听起来更像是一个设计问题.
免责声明
此代码不可使用,只是可以完成的示例.
使用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#方法的情况下如何调用它 ”。
使用.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)