जैसा कि यह पता चला है कि यह नहीं हैExpression.Lambda()
का उपयोग करके बहुत अधिक काम करता है। हालांकि, मुझे अभी भी अन्य उत्तरों में रुचि है।
/// <summary>
/// The name of the Invoke method of a Delegate.
/// </summary>
const string InvokeMethod = "Invoke";
/// <summary>
/// Get method info for a specified delegate type.
/// </summary>
/// <param name = "delegateType">The delegate type to get info for.</param>
/// <returns>The method info for the given delegate type.</returns>
public static MethodInfo MethodInfoFromDelegateType(Type delegateType)
{
Contract.Requires(
delegateType.IsSubclassOf(typeof(MulticastDelegate)),
"Given type should be a delegate.");
return delegateType.GetMethod(InvokeMethod);
}
जब आप EventInfo
है के लिए यह इस प्रकार के रूप में आप एक खाली लैम्ब्डा बना सकते हैं::
EventInfo _event;
...
MethodInfo delegateInfo
= DelegateHelper.MethodInfoFromDelegateType(_event.EventHandlerType);
ParameterExpression[] parameters = delegateInfo
.GetParameters()
.Select(p => Expression.Parameter(p.ParameterType))
.ToArray();
Delegate emptyDelegate = Expression.Lambda(
_event.EventHandlerType,
Expression.Empty(), "EmptyDelegate", true, parameters).Compile();
स्रोत
2012-03-22 13:54:45
मुझे लगता है कि यही कारण है कि ['Expression.Empty'] (http://msdn.microsoft.com/en-us/library/dd294122.aspx) केवल सी # 4.0 से शुरू हो रहा है? मैं वास्तव में एक बयान को एक अभिव्यक्ति वृक्ष में बदलना नहीं चाहता था, बल्कि दूसरी तरफ। एक अभिव्यक्ति वृक्ष विवरण जिसके परिणामस्वरूप 'खाली' प्रतिनिधि होता है। मुझे लगता है कि मुझे [_a_ समाधान अब] मिला है (http://stackoverflow.com/a/9823691/590790), लेकिन मैं बस उलझन में हो सकता हूं। :) –
@ स्टेवेनज्यूरिस: आह, मैंने आपके प्रश्न की जोर को गलत समझा। हां, आप एक अभिव्यक्ति वृक्ष "मैन्युअल" बना सकते हैं जो तार्किक रूप से एक खाली कथन ब्लॉक है। * सी # कंपाइलर * को आपके लिए लैम्ब्डा रूपांतरण के माध्यम से करने का कोई तरीका नहीं है, मेरा बिंदु था। –