也许使用动态模式?您可以使用dynamic关键字调用任何方法/属性,对吗?例如,如何在调用myDynamicObject.DoStuff()之前检查该方法是否存在?
用动态关键字声明的内容
—
Louis Rhys
也许使用动态模式?您可以使用dynamic关键字调用任何方法/属性,对吗?例如,如何在调用myDynamicObject.DoStuff()之前检查该方法是否存在?
Answers:
你可以这样写:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
编辑:您甚至可以执行扩展方法并像这样使用它
myObject.HasMethod("SomeMethod");
通过反射
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
方法也相似
GetType()
里面有像这样的方法GetProperties()
。返回的数组PropertyInfo
。但是如何使用GetProperties()
方法?
这是一个古老的问题,但我遇到了。
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;
}
}
最好不要为此使用任何动态类型,而让您的类实现一个接口会更好。然后,您可以在运行时检查对象是否实现了该接口,从而确定其是否具有预期的方法(或属性)。
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
我认为这是唯一正确的方法。
您要指的是鸭式输入法,这在您已经知道对象具有方法但编译器无法检查该方法的情况下很有用。例如,这在COM互操作方案中很有用。(检查该文章)
例如,如果您想将鸭式打字与反射结合起来,那么我认为您错过了鸭式打字的目标。
DynamicObject
吗?