在C#中动态生成委托类型

时间:2009-04-21 15:14:56

标签: c# delegates code-generation

我们需要动态生成委托类型。 我们需要根据输入参数和输出生成委托。输入和输出都是简单类型。

例如,我们需要生成

int Del(int, int, int, string)

int Del2(int, int, string, int)

任何关于如何开始这方面的指示都会非常有帮助。

我们需要解析表示为xml的表达式。

例如,我们将(a + b)表示为

<ADD>
    <param type="decimal">A</parameter>
    <param type="decimal">B</parameter>
</ADD>

我们现在希望将其公开为Func<decimal, decimal, decimal>。我们当然希望允许xml中的嵌套节点,例如:

(a + b) + (a - b  * (c - d)))

我们希望使用表达式树和Expression.Compile来完成此操作。

欢迎有关这种方法可行性的建议。

2 个答案:

答案 0 :(得分:11)

最简单的方法是使用现有的Func代表系列。

使用typeof(Func<,,,,>).MakeGenericType(...)。例如,对于int Del2(int, int, string, int)类型:

using System;

class Test
{
    static void Main()
    {
        Type func = typeof(Func<,,,,>);
        Type generic = func.MakeGenericType
            (typeof(int), typeof(int), typeof(string),
             typeof(int), typeof(int));
        Console.WriteLine(generic);
    }
}

如果你真的,真的需要创建一个真正的新类型,也许你可以提供更多的背景来帮助我们更好地帮助你。

编辑:正如Olsin所说,Func类型是.NET 3.5的一部分 - 但是如果你想在.NET 2.0中使用它们,你只需要自己声明它们,如下所示:

public delegate TResult Func<TResult>();
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
public delegate TResult Func<T1, T2, T3, TResult>
    (T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<T1, T2, T3, T4, TResult>
    (T1 arg1, T2 arg2, T3 arg3, T4 arg4);

如果4个参数对你来说还不够,你当然可以添加更多。

答案 1 :(得分:0)

如果您正在运行框架3.5(但不是每个人都是),Jon的答案可以正常运行。

2.0的答案是使用Delegate.CreateDelegate(...)

http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx

在早期的帖子中讨论了各种方法的比较,包括Jon的Func,Delegate.CreateDelegate,DynamicMethods和各种其他技巧:

Delegate.CreateDelegate vs DynamicMethod vs Expression

-Oisin