[英]Determining a unique identifier name using Roslyn
使用Roslyn,我基於從我的控件之外的代碼解析的方法符號生成C#代碼。 因此,該方法可以具有任意數量的參數。 我生成的代碼包含一個lambda表達式,它接受一個參數,例如:
// I'm generating code like this
public void SomeMethod()
{
DoSomething(x => x.Foo());
}
此代碼的潛在問題是如果包含方法包含名為x
的參數:
// my code generator might produce this
public void SomeMethod(int x)
{
DoSomething(x => x.Foo());
}
此代碼導致錯誤:
無法在此范圍內聲明名為“x”的本地或參數,因為該名稱用於封閉的本地范圍以定義本地或參數
很公平。
為了解決這個問題,我想我可以從標識符名稱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;
}
使用SemanticModel.LookupSymbols
似乎是一個很好的方法。 這是Visual Studio將所選代碼移動到新方法的方式。 查看Roslyn中的UniqueNameGenerator
內部類。
至於如何使用LookupSymbols
,只要你擁有一個方法符號:你已經添加了生成的DoSomething(x => x.Foo());
代碼,所以你不僅僅是一個方法符號,不是嗎? 但在任何情況下,從IMethodSymbol
你可以得到DeclaringSyntaxReferences
訪問相應的語法節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.