在运行时将 lambda 转换为委托
Convert lambda to delegate at runtime
我正在尝试在运行时使用 Expression
class 的静态方法绑定委托。首先,以下两个分配在编译时起作用:
public delegate void Progress(State value);
public enum State
{
}
public void DoStuff(int value)
{
}
...
Action<State> action = (State a) => { DoStuff((int)a); };
Progress actionDelegate = (State a) => { DoStuff((int)a); }; //this is what I'm trying to achieve
我正在尝试使用 Expression
class 绑定 Progress 委托,如下所示:
public void CreateDelegate()
{
var value = Expression.Variable(typeof(State), "a");
var castedValue = Expression.Convert(value, typeof(int));
var method = GetType().GetMethod("DoStuff");
var call = Expression.Call(Expression.Constant(this), method, castedValue);
var lamda = Expression.Lambda(call, value);
Progress compiled = (Progress)lamda.Compile(); //Invalid cast from Action<State> to Progress
}
Lambda.Compile
returns Action<State>
但我需要它成为 Progress
代表。我做错了什么?
你可以这样做:
var lamda = Expression.Lambda<Progress>(call, value);
Progress compiled = lamda.Compile();
我正在尝试在运行时使用 Expression
class 的静态方法绑定委托。首先,以下两个分配在编译时起作用:
public delegate void Progress(State value);
public enum State
{
}
public void DoStuff(int value)
{
}
...
Action<State> action = (State a) => { DoStuff((int)a); };
Progress actionDelegate = (State a) => { DoStuff((int)a); }; //this is what I'm trying to achieve
我正在尝试使用 Expression
class 绑定 Progress 委托,如下所示:
public void CreateDelegate()
{
var value = Expression.Variable(typeof(State), "a");
var castedValue = Expression.Convert(value, typeof(int));
var method = GetType().GetMethod("DoStuff");
var call = Expression.Call(Expression.Constant(this), method, castedValue);
var lamda = Expression.Lambda(call, value);
Progress compiled = (Progress)lamda.Compile(); //Invalid cast from Action<State> to Progress
}
Lambda.Compile
returns Action<State>
但我需要它成为 Progress
代表。我做错了什么?
你可以这样做:
var lamda = Expression.Lambda<Progress>(call, value);
Progress compiled = lamda.Compile();