如何在运行时为反射方法创建委托

时间:2010-06-23 06:48:08

标签: c# reflection dynamic delegates

我想创建一个反映方法的Delegate,但Delegate.CreateDelegate要求指定Type委托。是否可以动态创建一个匹配任何函数的“委托”?

这是一个简单的例子:

class Functions
{
    public Functions()
    {

    }

    public double GPZeroParam()
    {
        return 0.0;
    }

    public double GPOneParam(double paramOne)
    {
        return paramOne;
    }

    public double GPTwoParam(double paramOne, double paramTwo)
    {
        return paramOne+paramTwo;
    }
}

static void Main(string[] args)
{
    Dictionary<int, List<Delegate>> reflectedDelegates = new Dictionary<int, List<Delegate>>();
    Functions fn = new Functions();
    Type typeFn = fn.GetType();
    MethodInfo[] methods = typeFn.GetMethods();

    foreach (MethodInfo method in methods)
    {
        if (method.Name.StartsWith("GP"))
        {
            ParameterInfo[] pi = method.GetParameters();

            if (!reflectedDelegates.ContainsKey(pi.Length))
            {
                reflectedDelegates.Add(pi.Length, new List<Delegate>());
            }

            // How can I define a delegate type for the reflected method at run time?
            Delegate dlg = Delegate.CreateDelegate(typeof(???), fn, method);
            reflectedDelegates[pi.Length].Add(dlg);
        }
    }
}

更新

我发现最接近的是代码项目中的这个FastInvokeWrapper,但我仍然试图绕过它并且我不太明白GetMethodInvoker如何将反射的方法绑定到FastInvokeHandler

1 个答案:

答案 0 :(得分:1)

这种委托 - 反射优化的关键在于您知道在编译时需要什么类型的委托。如果将它强制转换为Delegate类似Delegate dlg =,则必须使用Invoke方法调用它,这是相同的反射。

因此,您应该使用IL生成或表达式树来生成像Func<object,object[],object>这样的中性委托。

另请阅读this以便更好地理解。