繁体   English   中英

C# 通过反射创建 Func

[英]C# Creating a Func via reflection

我有一些在运行时编译的代码。 今天它使用 MethodInfo.Invoke。 为了加快速度,我试图创建一个委托/函数,但我似乎无法找到正确的重载/参数来实现它。

当前代码在 lambda 编译时失败,并显示“为 lambda 声明提供的参数数量不正确”

.Net v4.61

任何帮助,将不胜感激。

// Contrived example code

public class MyItemClass
    {
        public bool IsDivisableBy3 { get; set; }

        public bool IsEven { get; set; }

        public MyItemClass(int value)
        {
            this.IsEven = value % 2 == 0;
            this.IsDivisableBy3 = value % 3 == 0;
        }
    }


public class RuleTestResult
    {
        public int RuleNumber { get; set; }
        public bool Result { get; set; }
    }

private static var VbCode = @"Public NotInheritable Class RuleTest

                        Private Shared Function Rule1(item As MyItemClass) As Boolean
                            If item.IsEven Then
                                Return True
                            End If
                        End Function
    
                        Private Shared Function Rule2(item As MyItemClass) As Boolean
                            If item.IsEven = False Then
                                If item.IsDivisableBy3 Then
                                    Return True
                                End If
                            End If
                        End Function
    
    
                        Public Shared Function FindRule(item As MyItemClass) As RuleTestResult
                            Select Case True
                                Case Rule1(item)
                                    Return New RuleTestResult With {.RuleNumber = 1, .Result = True}
                                Case Rule2(item)
                                    Return New RuleTestResult With {.RuleNumber = 2, .Result = True}
                                Case Else
                                    Return New RuleTestResult With {.RuleNumber = -1, .Result = False}
                            End Select
                        End Function
    
                    End Class";


public static void TestMe()
{
    // Make some test items
    var Items = new List<MyItemClass>();
    for (var i = 1; i <= 10; i++)
        Items.Add(new MyItemClass(i));

    // Compile the code
    var CompilerResult = Compile(VbCode);
    var Instance = CompilerResult.CompiledAssembly.CreateInstance("RuleTest");
    var AssType = Instance.GetType();
    var Method = Instance.GetType.GetMethod("FindRule");
    var Param = Expressions.Expression.Parameter(Method.GetParameters.First.GetType);

    // Create a func
    Expressions.Expression CallExpression = Expressions.Expression.Call(Method, Param);
    var MyFunc = Expressions.Expression.Lambda<Func<MyItemClass,RuleTestResult>>(CallExpression).Compile();

    //'Incorrect number of parameters supplied for lambda declaration'

    var Results = new List<RuleTestResult>();
    foreach (var item in Items)
    {
        Results.Add(MyFunc(item))
    }

}


我想我只需要发布这个来弄明白:)

var Param = Expressions.Expression.Parameter(typeof(RuleTest), "item"); var MyFunc = Expressions.Expression.Lambda<Func<MyItemClass,RuleTestResult>>(CallExpression**, Param**).Compile();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM