Roslyn का उपयोग करके एक अद्वितीय पहचानकर्ता नाम निर्धारित करना, मैं अपने नियंत्रण के बाहर कोड से पार्स किए गए विधि प्रतीक के आधार पर सी # कोड उत्पन्न कर रहा हूं। इसलिए, विधि में कई तर्क हो सकते हैं।Roslyn
// my code generator might produce this
public void SomeMethod(int x)
{
DoSomething(x => x.Foo());
}
इस कोड:
// I'm generating code like this
public void SomeMethod()
{
DoSomething(x => x.Foo());
}
इस कोड के साथ एक संभावित समस्या युक्त विधि एक पैरामीटर x
बुलाया भी शामिल है यदि: कोड मैं उत्पन्न एक लैम्ब्डा अभिव्यक्ति है कि इस तरह के रूप में एक भी तर्क लेता है, भी शामिल है परिणामस्वरूप एक त्रुटि:
A local or parameter named 'x' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter
पर्याप्त मेला।
इस के आसपास जाने के लिए, मैं सोच रहा था कि मैं पहचानकर्ता नाम x
से शुरू कर सकता हूं, यह देखने के लिए कि यह पहले से परिभाषित है या नहीं, SemanticModel.LookupSymbols
का उपयोग करें। यदि ऐसा है, तो _
(_x
प्राप्त करने के लिए) दोहराएं और दोहराएं।
लेकिन क्या यह सबसे अच्छा तरीका है? और यदि हां, तो मैं LookupSymbols
का उपयोग कैसे करूं जब मेरे पास एक विधि प्रतीक हो?
एक अन्य विकल्प जिसे मैंने सोचा था कि विधि प्रतीक में Parameters
संग्रह का उपयोग करना था। मैं इसके बजाय उनके खिलाफ एक ही नाम चयन एल्गोरिदम प्रदर्शन कर सकता था। लेकिन क्या यह पर्याप्त होगा? उदाहरण के लिए:
private static string GetIdentifierName(IMethodSymbol within)
{
var proposed = "x";
while (within.Parameters.Any(x => x.Name == proposed))
{
proposed = "_" + proposed;
}
return proposed;
}
जब मुझे विधि पैरामीटर पहचानकर्ताओं के खिलाफ सत्यापित करना पड़ा, तो मैंने आपके दूसरे दृष्टिकोण का भी उपयोग किया। –
आपको स्थानीय लोगों की जांच करने की भी आवश्यकता है। – SLaks
@ स्लक्स: मैं विधि उत्पन्न कर रहा हूं, इसलिए मैं स्थानीय लोगों के नियंत्रण में हूं (कोई भी नहीं है)। –