यह कोड का उपयोग करके सबसे अच्छा समझाया गया है। मेरे पास एक सामान्य वर्ग है जिसमें एक विधि है जो एक पूर्णांक देता है। यहाँ समझाने का प्रयोजनों के लिए एक सरल संस्करण ...अभिव्यक्ति कैसे बनाएं। लैम्ब्डा जब रनटाइम तक किसी प्रकार को ज्ञात नहीं है?
public class Gen<T>
{
public int DoSomething(T instance)
{
// Real code does something more interesting!
return 1;
}
}
रनटाइम पर मैं प्रतिबिंब का उपयोग कुछ के प्रकार की खोज करने और फिर उस विशिष्ट प्रकार के लिए मेरी जनरल वर्ग का एक उदाहरण बनाना चाहते है। यही कारण है कि ... काफी आसान है और इस तरह से किया है
Type fieldType = // This is the type I have discovered
Type genericType = typeof(Gen<>).MakeGenericType(fieldType);
object genericInstance = Activator.CreateInstance(genericType);
मैं अब एक अभिव्यक्ति है कि एक पैरामीटर के रूप में सामान्य प्रकार का एक उदाहरण ले जाएगा बनाने के लिए चाहते हैं और फिर उस प्रकार के DoSomething प्रणाली को बुलाती है। तो मैं अभिव्यक्ति प्रभावी रूप से इस प्रदर्शन करने के लिए चाहते हैं ...
int answer = genericInstance.DoSomething(instance);
... सिवाय मैं रनटाइम पर बाद में कुछ बिंदु तक 'उदाहरण' की जरूरत नहीं है और genericInstance उत्पन्न प्रकार के रूप में ऊपर देखा जा सकता है। लैम्ब्डा बनाने के लिए इस प्रकार है पर मेरे प्रयास ...
MethodInfo mi = genericType.GetMethod("DoSomething",
BindingFlags.Instance | BindingFlags.Public);
var p1 = Expression.Parameter(genericType, "generic");
var p2 = Expression.Parameter(fieldType, "instance");
var x = Expression.Lambda<Func<genericType, fieldType, int>>
(Expression.Call(p1, mi, p2),
new[] { p1, p2 }).Compile();
... ताकि बाद में मैं कुछ इस तरह से कॉल करने की कर सकते हैं ...
int answer = x(genericInstance, instance);
बेशक
, आप उदाहरण पैरामीटर के साथ Func प्रदान नहीं कर सकता है और इसलिए मुझे नहीं पता कि लैम्ब्डा पीढ़ी को पैरामीटर कैसे करें। कोई विचार?
एक अच्छा विचार है जो वास्तव में काम करता है। दुर्भाग्य से मैं दृढ़ता से टाइप किए गए संकलित लैम्ब्डा का उपयोग करना चाहता हूं। टाइप किए गए लैम्ब्डा की तुलना में डायनामिक इनवोक का उपयोग करना काफी धीमा है। –
क्या अभिव्यक्ति वृक्ष में चर को कैप्चर करना संभव है? मैं जेनेरिक इंस्टेंस को कैप्चर करने में मदद करूंगा क्योंकि यह कभी नहीं बदलेगा। –
@ फिलहाइट एचएम, मैं देखता हूं। मुझे देखने दो कि मैं और क्या कर सकता हूं। – vcsjones