也许使用动态模式?你可以使用dynamic关键字调用任何方法/属性,对吗?如何在调用myDynamicObject.DoStuff()之前检查方法是否存在,例如?
答案 0 :(得分:204)
你可以这样写:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
编辑:您甚至可以执行扩展方法并像这样使用
myObject.HasMethod("SomeMethod");
答案 1 :(得分:72)
通过反思
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
类似于方法
答案 2 :(得分:40)
这是一个老问题,但我刚刚碰到它。
如果有多个具有该名称的方法,Type.GetMethod(string name)
将抛出AmbiguousMatchException,因此我们更好地处理该情况
public static bool HasMethod(this object objectToCheck, string methodName)
{
try
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
catch(AmbiguousMatchException)
{
// ambiguous means there is more than one result,
// which means: a method with that name does exist
return true;
}
}
答案 3 :(得分:16)
不为此使用任何动态类型不是更好,并让您的类实现一个接口。 然后,您可以在运行时检查对象是否实现了该接口,因此具有预期的方法(或属性)。
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
我认为这是唯一正确的方法。
你所指的是duck-typing,这在你已经知道对象有方法的情况下很有用,但是编译器无法检查它。 例如,这在COM互操作场景中很有用。 (查看this文章)
如果你想将鸭子打字与反射相结合,那么我认为你错过了鸭子打字的目标。
答案 4 :(得分:0)
为了避免AmbiguousMatchException
,我宁愿说
objectToCheck.GetType().GetMethods().Count(m => m.Name == method) > 0