هل من الممكن أن يلقي المثال مندوب في التعبير امدا؟

StackOverflow https://stackoverflow.com/questions/465313

سؤال

وهنا السياق لسؤالي:

وتقنية شائعة هي أن يعلن المعلمة من طريقة كتعبير امدا بدلا من مفوض. وهذا هو الحال أن هذه الطريقة يمكن فحص التعبير أن تفعل أشياء مثيرة للاهتمام مثل معرفة أسماء استدعاءات الأسلوب في الجسم مثيل مندوب.

والمشكلة هي أن تفقد بعض الميزات ذكاء-الشعور Resharper. إذا أعلن المعلمة من طريقة كمندوب، فإن Resharper مساعدة عند كتابة الدعوة إلى هذا الأسلوب، مما دفع لك س => س تركيب لتزويد كقيمة الحجة إلى هذا الأسلوب.

وهكذا ... إلى سؤالي أود أن تفعل التالي:

    MethodThatTakesDelegate(s => s.Length);
}

private void MethodThatTakesDelegate(Func<string, object> func)
{
    //convert func into expression
    //Expression<Func<string, object>> expr = "code I need to write"

    MethodThatTakesExpression(expr);
}


private void MethodThatTakesExpression(Expression<Func<string, object>> expr)
{
    //code here to determine the name of the property called against string (ie the Length)
}
هل كانت مفيدة؟

المحلول

وفي كل مكان أن كنت تستخدم مصطلح "التعبير امدا" التي تعني في الواقع "شجرة التعبير".

وتعبير لامدا وبت في التعليمات البرمجية المصدر الذي هو

parameters => code

ومنها مثلا.

x => x * 2

وأشجار التعبير هي مثيلات System.Linq .Expressions.Expression الطبقة (أو بالأحرى، واحدة من الفئات المشتقة) التي تمثل الرمز كما البيانات.

يتم تحويل التعبير

وامدا من قبل المجمع إلى <م> إما أشجار التعبير (أو بالأحرى، رمز الذي يولد شجرة التعبير في وقت التنفيذ) <م> أو حالات مندوب.

ويمكنك تجميع مثيل LambdaExpression (والتي هي واحدة من الفئات الفرعية التعبير) إلى مندوب، ولكن لا يمكنك الذهاب العكس.

في نظرية أنه قد من الممكن أن يكتب مثل هذا "المنقح" على أساس IL إرجاعها من قبل <وأ href = "http://msdn.microsoft.com/en-us/library/ system.reflection.methodbase.getmethodbody.aspx "يختلط =" نوفولو noreferrer "> MethodBase.GetMethodBody في بعض الحالات، ولكن حاليا هناك مختلف الوفود التي لا يمكن أن يمثله أشجار التعبير . وتمثل شجرة التعبير و<م> التعبير بدلا من بيان أو كتلة بيان - لذلك ليس هناك حلقات، المتفرعة (باستثناء الشرطية)، وتعيين الخ وأعتقد أن هذا قد يتغير في NET. 4.0، على الرغم من أنني لن نتوقع خطوة بتفريغ من Microsoft ما لم يكن هناك سبب وجيه حقا لأحد.

نصائح أخرى

وأنا لا أعتقد أنه من الممكن تحقيق ما تريد هنا. من التعليقات في التعليمات البرمجية يبدو أنك تحاول التقاط اسم الخاصية التي لم المهمة في MethodThatTakesExpression. وهذا يتطلب التعبير امدا شجرة التعبير الذي يجسد contexnt من الوصول الممتلكات.

وعند نقطة قمت بتمرير مندوب إلى MethodThatTakesDelegate يتم فقدان هذا السياق. مندوبا فقط بتخزين عنوان طريقة لا أي سياق حول المعلومات الأسلوب. مرة واحدة يتم هذا التحويل فإنه من غير الممكن الحصول على إعادته.

مثال لماذا لم يكن هذا ممكنا هو قد لا يكون هناك حتى أسلوب يسمى بدعم مفوض. فمن الممكن لاستخدام ReflectionEmit لتوليد الطريقة التي لا يوجد لديه مسمى كان وموجود فقط في الذاكرة. فمن الممكن على الرغم من أن تعيين هذا إلى كائن وظائفها.

لا، غير ممكن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top