【问题标题】:Generating Delegate Types dynamically in C#在 C# 中动态生成委托类型
【发布时间】:2010-10-20 20:40:13
【问题描述】:

我们需要动态生成委托类型。 我们需要在给定输入参数和输出的情况下生成委托。输入和输出都是简单类型。

例如,我们需要生成

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&lt;decimal, decimal, decimal&gt;。我们当然希望在 xml 中允许嵌套节点,例如:

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

我们希望使用表达式树和Expression.Compile 来做到这一点。

欢迎就这种方法的可行性提出建议。

【问题讨论】:

    标签: c# delegates code-generation


    【解决方案1】:

    最简单的方法是使用现有的Func 代表家族。

    使用typeof(Func&lt;,,,,&gt;).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 个参数对您来说还不够,您当然可以添加更多。

    【讨论】:

    • AB 就是一个例子。我们想在运行时从中创建一个可调用的方法。
    • 恐怕您还没有真正向我们提供足够的信息来说明问题所在或方法,让我们判断这是否是一个好主意。一般来说,使用表达式树听起来是一种合理的方法,但我不太确定您的问题的其余部分如何适应这种情况。
    • 我们正在尝试递归解析 XML 并生成表达式树。我们被困在从表达式树生成可调用方法的问题上。我们不想使用 LCG 并自己发出操作码。为每个节点生成一个委托,然后链接委托也是一种选择。
    • 是否可以使用 Expression 动态地为每个节点创建表达式树树,然后对其执行 .Compile ?比如ABC,应该导致Func.
    • 我们需要动态地这样做。 stackoverflow.com/questions/346523/…
    【解决方案2】:

    如果您运行的是 framework 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

    -奥辛

    【讨论】:

    • Delegate.CreateDelegate 创建一个委托类型的instance,而不是类型本身。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-12-04
    • 2011-01-16
    相关资源
    最近更新 更多