我使用DynamicObject来包装内部对象和掩码泛型,但是当我尝试在内部对象上调用某些方法时,它们需要键入的参数,但是我将所有参数都视为Object类型,因此调用失败。 / p>
代码:
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
try
{
result = mInternalObject.GetType().InvokeMember(binder.Name, (BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public), null, mInternalObject, args);
return true;
}
catch (Exception)
{
return base.TryInvokeMember(binder, args, out result);
}
}
所以基本上,我想知道如何让它忽略参数类型并使用对象调用方法,任何sugestions?
答案 0 :(得分:3)
我怀疑你想要的东西(伪代码,非常简化):
var mem = internalObject.GetType().GetMember(binder.Name);
if (mem.IsGenericDefinition)
mem = mem.MakeGeneric(Array.Convert(args, x => x.GetType()));
var result = mem.Invoke(null, internalObject, args);
答案 1 :(得分:0)
由于您使用的是动态,因此您可以使用开源really late binding项目中的ImpromptuInterface,而不是反射。它比反射更快,并且可以处理更多种类的对象(例如其他动态对象),并且可以推断泛型,同时也允许您指定,使一切变得更加简单。