在C#中动态生成委托类型在C#中动态生成委托类型(Generating Delegate Types

2019-05-12 03:32发布

我们有我们需要在飞行中产生的委托类型的要求。 我们需要产生给定的输入参数和输出的代表。 输入和输出是简单类型。

例如,我们需要生成

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

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

Answer 1:

最简单的方法是使用现有的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个参数是不够的,你可以添加更多的课程。



Answer 2:

如果你正在运行框架3.5(但并非每个人),乔恩的回答工作正常。

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

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

各种方式来做到这一点,包括Jon的函数功能的比较,Delegate.CreateDelegate,DynamicMethods和其他各种招数是在更早的线程讨论:

Delegate.CreateDelegate VS DynamicMethod的VS表达

-Oisin



文章来源: Generating Delegate Types dynamically in C#