कुछ दिनों के लिए अभिव्यक्ति पेड़ के साथ मेरे काम के दौरान, मैं कुछ ऐसा हुआ जो मुझे समझना मुश्किल लगता है; उम्मीद है कि कोई यहां कुछ प्रकाश डालेगा।अभिव्यक्ति कैसे बनाएं <Func <गतिशील, गतिशील >> - या यह एक बग है?
यदि आप Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;
कोड करते हैं तो संकलक शिकायत करेगा और आपको कहीं भी नहीं मिलेगा। हालांकि, यह लगता है कि यदि आप किसी विधि के माध्यम से ऐसी एक अभिव्यक्ति बनाते हैं तो संकलक इसके बारे में खुश दिखता है और परिणामी ऐप काम करता है। यह समझ में नहीं आता है, इसलिए मैं सोच रहा हूं कि पर्दे के पीछे क्या चल रहा है।
मुझे लगता है कि, हुड के नीचे, अभिव्यक्ति ConvertExpression
द्वारा लौटाए प्रकार Expression<Func<object, object>>
है, जो एक मान्य प्रकार है की शायद है, लेकिन यह पहेली मुझे लगता है कि मैं एक घोषणा में Expression<Func<dynamic, dynamic>>
प्रकार का उपयोग नहीं कर सकते हैं और अभी तक मैं इसे उपयोग कर सकते हैं एक विधि के वापसी प्रकार के रूप में। नीचे एक उदाहरण देखें।
बहुत बहुत धन्यवाद!
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;
}
}
अभिव्यक्ति पेड़ में गतिशीलता - समाधान यहां: [http://stackoverflow.com/questions/3562088/c-4- गतिशील-in-expression-trees ](httpoverflow.com/questions/3562088/c -4-गतिशील-इन-अभिव्यक्ति-पेड़) –