我正在为C#中的动态行为编写一个包装器。如果我使用GetMethod(),那么当有多个方法(重载)时会抛出一个异常。我认为,在运行时,如果存在参数不匹配的情况,就会变得很明显。这是解决问题的好办法吗?
public class StaticMembersDynamicWrapper : DynamicObject
{
private Type _type;
public StaticMembersDynamicWrapper(Type type) { _type = type; }
// Handle static methods
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var methods = _type
.GetMethods(BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public)
.Where(methodInfo => methodInfo.Name == binder.Name);
var method = methods.FirstOrDefault();
if (method != null)
{
result = method.Invoke(null, args);
return true;
}
result = null;
return false;
}
}发布于 2011-05-01 00:37:15
方法信息返回的顺序似乎不是一个定义的顺序,我建议对参数类型进行过滤,以避免当顺序发生变化时,所有这些信息都崩溃的风险。
此外,您可能希望考虑在基类和子类上定义方法时的情况。
class A
{
public static void DoAwsomeStuff()
{
// really awsome stuff.
}
}
class B : A
{
public static void DoAwsomeStuff()
{
// different but still awsome stuff.
}
}隐藏这样的静态方法可能会受到反对,但同样,我建议使用最具体的声明类型来选择该方法。只是为了安全。
MethodInfo method = null;
foreach(var current in methods)
{
if(method == null || current.DeclaringType.IsAssignableFrom(method.DeclaringType))
{
method = current;
}
}编辑:
另一个值得探讨的可能性是Type.InvokeMember()的使用。这已经考虑到了为您隐藏的参数类型和方法。
try
{
result = _type.InvokeMember(
binder.Name,
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.InvokeMethod,
null,
null,
args
);
return true;
}
catch(MissingMethodException)
{
result = null;
return false;
}https://codereview.stackexchange.com/questions/2184
复制相似问题