簡體   English   中英

使用Roslyn確定唯一標識符名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM