यह यह करने के लिए संभव है एक विशेषता पैरामीटर पर पैरामीटर। क्या यह नीचे करना संभव है?निर्माता गुण लैम्ब्डा
class ExpandableQueryAttribute: Attribute {
private LambdaExpression someLambda;
//ctor
public ExpandableQueryMethodAttribute(LambdaExpression expression)
{
someLambda = expression
}
}
//usage:
static LambdaExpression exp =
(Expression<Func<IQueryable<Person>, Person>>)
(p => p.FirstOrDefault());
[ExpandableQueryAttribute(exp)] //error here
// "An attribute argument must be a constant expression, typeof expression
// or array creation expression of an attribute parameter type"
मेरा लक्ष्य एक विधि या विशेषता का निर्माता में लैम्ब्डा निर्दिष्ट करने के लिए है (भले ही मैं एक पूर्ण विधि नामित घोषित करने और विधि का नाम किसी भी तरह से पारित करने के लिए है, कि करने के लिए ठीक हो जाएगा) ।
पैरामीटर प्रकार बदल सकते हैं, लेकिन यह महत्वपूर्ण है कि विशेषता निर्माता है कि पैरामीटर ले जा सकते हैं और किसी तरह से प्रकार LambdaExpression के एक क्षेत्र निर्दिष्ट करने के लिए
मैं की घोषणा चाहते सक्षम हो लैम्बडा/विधि विशेषता कन्स्ट्रक्टर या इनलाइन पर कॉल के ठीक ऊपर होने के लिए, ताकि आपको यह देखने के लिए दूर जाना पड़े कि क्या हो रहा है।
तो इन विकल्पों ठीक होगा, लेकिन कोई किस्मत उन्हें काम करने के लिए हो रही है:
public static ... FuncName(...){...}
[ExpandableQueryAttribute(FuncName)]
// ...
या
//lambdas aren't allowed inline for an attribute, as far as I know
[ExpandableQueryAttribute(q => q.FirstOrDefault())]
// ...
मौजूदा काम के आसपास निर्माता के लिए एक नंबर आईडी पारित करने के लिए है ("तर्क निरंतर होना चाहिए" आवश्यकता को पूरा करना), जिसका उपयोग कन्स्ट्रक्टर द्वारा एक शब्दकोश में लुकअप करने के लिए किया जाता है जहां अभिव्यक्ति पहले जोड़ दी गई थी। यह सुधारने/सरल बनाने की उम्मीद कर रहा था, लेकिन मुझे एहसास है कि यह विशेषता रचनाकारों पर सीमाओं के कारण बेहतर नहीं होता है।
अपनी भावना का पालन करें ... विशेषता तर्क पर सीमा स्पष्ट है। –
इस लिंक पर सवाल भी पूछा गया था। जवाब यह था कि यह वर्तमान में संभव नहीं है। http://social.msdn.microsoft.com/Forums/en/vcsharp2008prerelease/thread/0d18c410-07b0-41cc-9c7f-9494633ca101 – Jamey
@ जेमी यिप, यह आखिरी विकल्प है जो मैंने सूचीबद्ध किया था जो मुझे पता था कि एक सीमा थी। अभिव्यक्ति को एक चर के रूप में घोषित करके उस पर काम करने की उम्मीद थी, लेकिन फिर "निरंतर होना चाहिए" आवश्यकता मुझे मिली। हालांकि कामकाज दिलचस्प है, और मैं इसके बदलाव की कोशिश करने जा रहा हूं। – AaronLS