[英]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.