2012-02-17 27 views
18

में संकलन समय प्रतिबिंब मैं अक्सर सी # कोड लिखता हूं जिसे संपत्ति नामों को व्यक्त करने के लिए जादू तारों का उपयोग करना होता है। हर कोई जादू तारों के साथ समस्याओं को जानता है। उन्हें रिफैक्टर करने में बहुत मुश्किल होती है, उनके पास कोई संकलन समय जांच नहीं होती है, और अक्सर वे समस्याओं का निदान करने के लिए कठिन होते हैं। फिर भी सी #/एनईटी उन्हें संपत्ति/वर्ग/विधि नामों का प्रतिनिधित्व करने के लिए पर पर उपयोग करता है।सी #

यह समस्या वर्षों और वर्षों तक जारी रही है, और वर्तमान में एकमात्र व्यवहार्य समाधान एक अभिव्यक्ति वृक्ष का उपयोग करना है जिसे संपत्ति के नाम के लिए रन-टाइम पर पार्स किया जाता है। यह आपको संतोषजनक संकलन-समय की जांच करता है, लेकिन यह कोड को जटिल करता है (प्रकार अभिव्यक्ति के पैरामीटर की आवश्यकता होती है), और इसमें रन-टाइम लागत होती है।

क्या किसी को पता है कि सी #/.NET के लिए इस व्यापक समस्या को दूर करने के लिए संकलन-समय प्रतिबिंब जोड़ने के लिए कभी भी फीचर विचार किया गया है?

ऐसा लगता है कि यह एक आसान जोड़ होगा, यह एक गैर-तोड़ने वाला बदलाव होगा, और इससे कई डेवलपर्स को बहुत फायदा होगा। टाइपऑफ() ऑपरेटर पहले से ही संकलन-समय प्रतिबिंब का एक रूप निष्पादित करता है, इसलिए ऐसा लगता है कि एक ऑपरेटर नाम() (या कुछ समान) बहुत ही मानार्थ होगा।

इसके अलावा, क्या किसी को इस तरह की सुविधा के साथ किसी भी संभावित मुद्दे के बारे में पता है?

सहायता के लिए धन्यवाद।

+0

संभावित डुप्लिकेट [संपत्ति निर्दिष्ट करने के लिए "जादू स्ट्रिंग" का उपयोग करने से बचने के लिए लैम्ब्डा अभिव्यक्ति का उपयोग करना] (http://stackoverflow.com/questions/3330758/using-a-lambda-expression-to-avoid-using -ए-जादू-स्ट्रिंग-टू-निर्दिष्ट-ए-प्रॉपर्टी) –

+1

यह भी देखें: [एक स्ट्रिंग के रूप में, एक अभिव्यक्ति से संपत्ति प्राप्त करें >] (http://stackoverflow.com/questions/2789504/get-the-property-as-a-string-from-an-expressionfunctmodel-tproperty) –

+3

@ किर्कवॉल यह उस प्रश्न का डुप्लिकेट नहीं है। प्रश्न का दूसरा अनुच्छेद इंगित करता है कि एमजीएसएम अभिव्यक्ति वृक्ष तकनीक से परिचित है; सवाल यह है कि क्या कामों में एक नई सुविधा हो सकती है जो समस्या के नए समाधान की अनुमति देगी। – phoog

उत्तर

11

Straight from the source - यह एक सी # भाषा डिजाइनर द्वारा एक ब्लॉग पोस्ट है, और इस पोस्ट में "उपयोगकर्ता" आपके जैसा ही उत्तर देता है और उत्तर दिया जाता है। लेखक का कहना है कि प्रत्येक मेटाडेटा आइटम के लिए सिंटैक्स निर्दिष्ट करने की आवश्यकता होगी जिसे आप पूछना चाहते हैं और यह छोटा नहीं है - यानी। जो आप चाहते हैं कि अधिभार, यदि आप "जानकारी की" विधि चाहते हैं और विधि अधिभारित है? क्या होगा यदि जेनेरिक और स्पष्ट इंटरफ़ेस कार्यान्वयन शामिल हैं? और इसी तरह। यह पता चला है, जबकि उन कारणों से 200 9 में कार्यान्वयन के योग्य समझा नहीं गया था, हम इसे 2015 में सी # 6 में प्राप्त करेंगे - C# Language Design Notes for Jul 9, 2014 देखें।

+1

ठीक है, यह एक सी # भाषा डिजाइनर से एक ब्लॉग पोस्ट है जिसमें वास्तविक मुद्दों के बारे में "जानकारी () "ऑपरेटर जो टाइपफॉफ़ की तरह काम करता है लेकिन किसी भी मेटाडाटा (विधि, संपत्ति इत्यादि) के लिए। ओपी लेख से "उपयोगकर्ता" के समान प्रश्न पूछता है और "उपयोगकर्ता" को सभी उत्तरों मिलते हैं। – cynic

+2

एरिक का जवाब यह इंगित करता है कि अभिव्यक्तियों का उपयोग करके समस्या हल हो गई है। लेकिन माइक्रोसॉफ्ट की कई तकनीकें कक्षाओं/गुणों का प्रतिनिधित्व करने के लिए जादू तारों का उपयोग करती हैं: एएसपी .NET (वेब ​​फॉर्म और एमवीसी), सिल्वरलाइट, डब्ल्यूपीएफ, विनफॉर्म; वे सभी उनका उपयोग करते हैं। तीसरे पक्ष के डेवलपर्स का जिक्र नहीं करना जिनके पुस्तकालयों पर आप भरोसा कर सकते हैं। और यदि आप काफी मेहनत करते हैं तो आपको मूल पुस्तकालय भी मिलेंगे जो उनका उपयोग करते हैं। मेरे लिए यह समस्या के मुकाबले एसिंक/प्रतीक्षा करने वाले मुद्दे की तुलना में अधिक व्यापक समस्या (और जिसे संबोधित करना आसान है) की तरह लगता है। – MgSam

+1

मुझे नहीं लगता कि पोस्ट जवाब है क्यों नहीं उन गुणों के लिए जिन्हें अधिभारित नहीं किया जा सकता है। – ja72

0

फिर भी सी #/.NET संपत्ति/वर्ग/विधि नामों का प्रतिनिधित्व करने के लिए उन्हें जगह पर सभी जगहों का उपयोग करता है।

पहला बंद: मैं असहमत हूं। कुछ ढांचे (वेबफॉर्म, उदा।) हैं जो पूरे स्थान पर जादू तारों का उपयोग करते हैं, लेकिन सी # और .NET के लिए आधार पुस्तकालय ऐसी चीजों से काफी अच्छी तरह से बचते हैं।

दूसरा: कई उदाहरणों में जहां जादू तारों का उपयोग किया जाता है, ReSharper त्रुटियों को पहचानने में सक्षम है। यह काफी मदद कर सकता है।

अंत में: जो आप पूछ रहे हैं वह रोज़लिन कंपेलर के माध्यम से संभव हो सकता है, जो "सेवा के रूप में संकलन" प्रदान करने का वादा करता है।

+1

मैं मानता हूं कि मूल .NET libs जादू तारों से दूर रहती है, लेकिन यदि आपने एमवीसी 3 को बिल्कुल देखा है, ओह मैन, इसका मैजिकस्ट्रिंग नरक :) अगर आप गलत नियंत्रक या क्रिया में टाइप करते हैं तो आपको यह बताने की क्षमता के लिए धन्यवाद एक स्ट्रिंग पैरामीटर में नाम! – CodingWithSpike

+1

इस सुविधा को संभव बनाने के लिए संकलन समय के दौरान संकलक पहले से ही सभी प्रासंगिक जानकारी जानता है। मेरी समझ से Roslyn संकलन-समय से पहले कोड में समान अंतर्दृष्टि प्राप्त करने के लिए तृतीय पक्षों को आसानी से सक्षम करेगा। – MgSam

+1

@MgSam: Roslyn आपके स्वयं के संकलन नियमों को स्थापित करना संभव बनाता है, इसलिए यह आपको संकल्प समय पर एक विधि नाम, नियंत्रक नाम इत्यादि में परिवर्तित होने वाले कोड में अभिव्यक्ति वृक्ष लिखने की अनुमति दे सकता है। – StriplingWarrior

6

मुझे एक ही समस्या थी। हाल ही में पता चला है कि .NET Framework 4.5 में Caller Info विशेषताएँ नामक एक सुविधा है। इनका उपयोग करके, आप कॉलर के बारे में जानकारी संकलित समय पर एक विधि के लिए प्राप्त कर सकते हैं। आप स्रोत कोड का फ़ाइल पथ, स्रोत कोड में पंक्ति संख्या और कॉलर के सदस्य नाम प्राप्त कर सकते हैं।

public void DoProcessing() 
{ 
    TraceMessage("Something happened."); 
} 

public void TraceMessage(string message, 
     [CallerMemberName] string memberName = "", 
     [CallerFilePath] string sourceFilePath = "", 
     [CallerLineNumber] int sourceLineNumber = 0) 
{ 
    Trace.WriteLine("message: " + message); 
    Trace.WriteLine("member name: " + memberName); 
    Trace.WriteLine("source file path: " + sourceFilePath); 
    Trace.WriteLine("source line number: " + sourceLineNumber); 
} 
7

सी # 6.0 में, एक नए ऑपरेटर, nameof, जोड़ा जा रहा है कि आप संकलन समय पर के गुणों, वर्ग, क्षेत्रों, घटनाओं, और चर नाम प्राप्त करने की अनुमति देगा।जानकारी के लिए

Link to the design notes

कोई और अधिक प्रतिबिंब संकलक पहले से ही डिजाइन समय में जानता है!

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^