Trong công việc của tôi với cây biểu hiện trong một vài ngày nay, tôi bắt gặp một cái gì đó mà tôi thấy khó hiểu; hy vọng ai đó sẽ có thể làm sáng tỏ ở đây.Cách tạo Biểu thức <Func <động, động >> - Hay là một lỗi?
Nếu bạn mã Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;
trình biên dịch sẽ khiếu nại và bạn sẽ không nhận được bất kỳ đâu. Tuy nhiên, nó dường như rằng nếu bạn tạo ra một biểu thức như vậy thông qua một phương pháp thì trình biên dịch có vẻ là hạnh phúc về nó và các ứng dụng kết quả hoạt động. Điều này không có ý nghĩa, vì vậy tôi tự hỏi những gì diễn ra đằng sau tấm màn.
Tôi cho rằng, dưới mui xe, khái niệm được trả về bởi ConvertExpression
có lẽ là loại Expression<Func<object, object>>
, mà là một loại hợp lệ, nhưng nó câu đố với tôi rằng tôi không thể sử dụng Expression<Func<dynamic, dynamic>>
gõ vào một lời tuyên bố và nhưng tôi có thể sử dụng nó là kiểu trả về của một phương thức. Xem ví dụ bên dưới.
Cảm ơn rất nhiều!
public class ExpressionExample
{
public void Main()
{
// Doesn't compile:
//Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;
// Compiles and works - OK
Expression<Func<double, double>> expr2 = x => 2 * x;
Func<double, double> func2 = (Func<double, double>)expr2.Compile();
Console.WriteLine(func2(5.0).ToString()); // Outputs 10
// Compiles and works - ??? This is the confusing block...
Expression<Func<dynamic, dynamic>> expr3 = ConvertExpression(expr2);
Func<dynamic, dynamic> func3 = (Func<dynamic, dynamic>)expr3.Compile();
Console.WriteLine(func3(5.0).ToString()); // Outputs 10
// Side note: compiles and works:
Expression<Func<object, object>> expr4 = x => double.Parse(2.ToString()) * double.Parse(x.ToString());
Func<object, object> func4 = (Func<object, object>)expr4.Compile();
Console.WriteLine(func4(5.0).ToString()); // Outputs 10
}
private Expression<Func<dynamic, dynamic>> ConvertExpression<TInput, TOutput>(Expression<Func<TInput, TOutput>> expression)
{
Expression<Func<object, TInput>> convertToInput = value => (TInput)value;
// The following doesn't compile: var input = Expression.Parameter(typeof(dynamic), "input");
var input = Expression.Parameter(typeof(object), "input");
Expression<Func<TOutput, dynamic>> convertToOutput = value => (dynamic)value;
var body = Expression.Invoke(convertToOutput, Expression.Invoke(expression, Expression.Invoke(convertToInput, input)));
var lambda = Expression.Lambda<Func<dynamic, dynamic>>(body, input);
return lambda;
}
}
Động lực trong cây biểu thức - Giải pháp tại đây: [http://stackoverflow.com/questions/3562088/c-4-dynamic-in-expression-trees](http://stackoverflow.com/questions/3562088/c -4-năng động-trong-biểu hiện-cây) –