12

Roslyn-CTPで少し実験しています。

var現在、コンクリートタイプに交換しようとしています。

var i=1;

次のようになります。

int i=1;

推論されたタイプを理解するのは簡単です。しかし、この部分はセマンティックモデルで発生するため、。を取得しITypeSymbolます。置換は構文モデルで行われるため、が必要TypeSyntaxです。肥大化した名前()は必要ないのでglobal::System.Int32、変換はコンテキストに依存します(using、ネストされたタイプなど)。

Roslynの一部であるVisualStudioバージョンには、「タイプ名の簡略化」クイックフィックスにこの機能がすでに含まれていますが、サンプルを調べると、この変換を行う簡単な方法が見つかりませんでした。


Kevin Pilch-Bissonの回答に基づいて、私は現在使用しています。

var location = document.GetSyntaxTree().GetLocation(node);
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel());

ToMinimalDisplayStringから取得できる場所CommonSyntaxTree

さらに複雑なのはToMinimalDisplayString、クラスLocationとを必要とするのSemanticModelに対し、document.GetSemanticModel()CommonSyntaxTree.GetLocationはインターフェイスのみを返すことです。
私は単にクラスにキャストすることで回避しましたが、これは今のところうまくいくようです。

うーん、クラスはC#固有であり、インターフェイスは言語に依存しないようです。


動作するバージョンをgithubにアップロードしました:https ://github.com/CodesInChaos/Roslyn

では機能しませんがvarforeachこれが現在のRoslynビルドの制限であると思われます。

4

2 に答える 2

15

ToMinimalDisplayString()に適用される拡張メソッドを使用して、特定の場所でシンボルを表す最短の有効な文字列を取得できますISymbol(注: これは `Roslyn.Compilers.CSharp.SymbolDisplay.

免責事項: 私は Microsoft の Roslyn チームで働いています。

于 2011-11-22T18:21:41.957 に答える
-1

問題: nullable の引数の型を見つけます。これは、カスタム オブジェクトまたはシステム識別子です。

c# では、customobject には kind() == 識別子があり、bool/string/ には事前定義された型があります。

これは、引数の型をnullableにする方法です

[ここでの識別子名は、それがカスタム オブジェクトであることを示しています。PredefinedType にすることができます]

 Class A
 {
     public bool ? test;
    public b ? obj1;
 }
 // Get the semantic model and get the property declarationsyntax

 PropertyDeclarationSyntax prop = (get it somehow)[]

 INamedTypeSymbol tp = (INamedTypeSymbol)x.Type;

 string nameoftype = tp.TypeArguments.FirstOrDefault().Name;

 ITypeSymbol s1 = tp.TypeArguments.FirstOrDefault();

 TypeSyntax t1 = SyntaxFactory.ParseTypeName(s1.ToMinimalDisplayString(semanticModel, 
 prop.SpanStart));

 t1.kind == IdentifierName meaning its custom object type.
于 2021-05-03T23:21:13.320 に答える