这是否可能没有反射,否则反射?这在PHP中经常用于Wordpress中。
伪代码中的东西:
if (exists(object.method)) {object.method}
或
try {object.method} finally {...}
答案 0 :(得分:18)
好吧,您可以在界面中声明它,然后使用:
IFoo foo = bar as IFoo;
if (foo != null)
{
foo.MethodInInterface();
}
假设您可以使对象的实际类型实现接口。
否则你需要使用反射AFAIK。
(编辑:其他地方提到的动态类型也可以在.NET 4上运行,当然......但是为此捕获异常是非常讨厌的IMO。)
答案 1 :(得分:10)
您可以使用动态并捕获运行时异常:
dynamic d = 5;
try
{
Console.WriteLine(d.FakeMethod(4));
}
catch(RuntimeBinderException)
{
Console.WriteLine("Method doesn't exist");
}
虽然听起来更像是一个设计问题。
<强>声明强>
这段代码不是用的,只是一个可以做的例子。
答案 2 :(得分:7)
使用.GetType().GetMethod()
检查它是否存在,然后.Invoke()
检查它。
var fooBar = new FooBarClass();
var method = fooBar.GetType().GetMethod("ExistingOrNonExistingMethod");
if (method != null)
{
method.Invoke(fooBar, new object[0]);
}
答案 3 :(得分:4)
使用C#4.0中的dynamic
类型,可以执行以下操作:
dynamic obj = GetDynamicObject();
if (obj != null && obj.GetType().GetMethod("DoSomething") != null)
{
obj.DoSomething();
}
但是,首先判断一个类型是否有方法的唯一方法是使用反射;因此,上述方法并没有真正为您带来任何好处(您也可以通过调用MethodInfo
并仅GetMethod
来获取Invoke
。
修改:如果你打算尝试调用该方法,即使它不在那里,那么Yuriy's answer可能就是你正在寻找的。我的原始答案是对您提出问题的方式的字面回答:“如果只有存在,如何调用C#方法。”
答案 4 :(得分:2)
我遇到了同样的答案,但不喜欢任何解决方案。
这是我的:
"c_item"
答案 5 :(得分:1)
你应该先修改存在。 MethodInfo[] myArrayMethodInfo = myType.GetMethods();