ठीक है, तुम, अभिव्यक्ति और गहराई में जाने की जरूरत होगी MethodCallExpression
लगता है , और फिर इसके लिए तर्क देखें। ध्यान दें कि हमारे पास o
का मान नहीं है, इसलिए हमें यह मानना होगा कि विधि के तर्क उस पर भरोसा नहीं करते हैं। इसके अलावा हम अभी भी यह मान रहे हैं कि लैम्ब्डा अभिव्यक्ति सिर्फ MethodCallExpression
पर निर्भर करती है?
संपादित करें: ठीक है, यहां एक संपादित संस्करण है जो तर्कों का मूल्यांकन करता है। हालांकि, यह मानता है कि आप वास्तव में तर्कों के भीतर लैम्ब्डा अभिव्यक्ति पैरामीटर का उपयोग कर रहे हैं (जो new object[1]
है - यह प्रभावी रूप से एक शून्य पैरामीटर प्रदान कर रहा है)। इस अर्थ में कि यह मूल रूप नहीं है -
using System;
using System.Linq.Expressions;
class Foo
{
public void Save(int x, string y, int z, double d)
{
}
}
class Program
{
static void Main()
{
var x = 1;
var a = 2;
var b = 3;
ShowValues<Foo>(o => o.Save(x, "Jimmy", a + b + 5, Math.Sqrt(81)));
}
static void ShowValues<T>(Expression<Action<T>> expression)
{
var call = expression.Body as MethodCallExpression;
if (call == null)
{
throw new ArgumentException("Not a method call");
}
foreach (Expression argument in call.Arguments)
{
LambdaExpression lambda = Expression.Lambda(argument,
expression.Parameters);
Delegate d = lambda.Compile();
object value = d.DynamicInvoke(new object[1]);
Console.WriteLine("Got value: {0}", value);
}
}
}
स्रोत
2010-09-22 06:07:58
@ ओमु: लेकिन क्या आप वास्तव में कोड चाहते हैं जो टूट जाएगा - केवल निष्पादन समय पर - यदि आपने * किसी भी * लैम्ब्डा अभिव्यक्ति के अन्य रूप का उपयोग किया है? यदि आप हमेशा * कॉलिंग कॉल करने जा रहे हैं, तो क्यों न केवल पैरामीटर को सीधे पास करें? –
@ जोन स्कीट, मैं विभिन्न पैरामीटर के साथ कई अन्य तरीकों को बुला रहा हूं, मुझे नहीं पता था कि मैं केवल स्थिर मूल्यों के साथ कॉल कर सकता हूं, मुझे लगता है कि मुझे इस और – Omu
@Omu की जांच करनी होगी: बिना किसी स्पष्टीकरण वाले प्रश्न में डंपिंग कोड के साथ यह समस्या है। मैंने कहा * यह भंगुर था, और जैसे ही आपने किसी अन्य पैटर्न का उपयोग करना शुरू कर दिया था ... –