无论参数类型如何,都调用对象方法

时间:2011-04-29 06:11:22

标签: c# reflection dynamic .net-4.0

我使用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?

2 个答案:

答案 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,而不是反射。它比反射更快,并且可以处理更多种类的对象(例如其他动态对象),并且可以推断泛型,同时也允许您指定,使一切变得更加简单。