2016-09-30 15 views
2

私は文字列でジェネリック型を取得しようとしていますが、IL表現のようなものがあります。実際の出力表現が必要です。ジェネリック型のソースコードを取得しますか?

Type t = typeof(Stack<string>); 

string source = t.Name;  //Stack`1[System.String] 
string source = t.ToString(); //System.Collections.Generic.Stack`1[System.String] 

私はちょうど必要があります。

string source //Stack<string> 
+1

ジェネリック型のIL表現とC#表現は同じ構文を使用せず、VBはもう一つのストーリー( 'Stack(Of Stack) ')です。したがって、それには「実際のソース表現」はありません。 – Lucero

+0

あなたがしようとしていることは非常にわかりません... http://stackoverflow.com/questions/9811456/generics-with-ilのようなものは助けになるかもしれませんが、本当にタイプの文字列表現は必要ありませんILを生成する... –

+2

私は同意しない、彼の質問は完全にはっきりしています。彼はちょうどILがどのように見えるのかという誤った考えを持っています。彼は出力が 'Stack 'であることを望んでいます。彼はIL関連のことは一切欲しません。 – Amy

答えて

3

私はこの拡張メソッド、GetPrettyName()を持っています。これは基本的に次のとおりです。

public static string GetPrettyName(this Type type) 
{ 
    var retval = type.Name; 

    if (type.IsGenericType) 
    { 
     var genargNames = type.GetGenericArguments().Select(t => GetPrettyName(t)); 
     var idx = type.Name.IndexOf('`'); 
     var typename = (idx > 0) ? type.Name.Substring(0, idx) : type.Name; 
     retval = String.Format("{0}.{1}<{2}>", type.Namespace, typename, String.Join(", ", genargNames)); 
    } 
    else if (type.IsArray) 
    { 
     retval = GetPrettyName(type.GetElementType()) + "[]"; 
    } 
    else if (String.IsNullOrEmpty(retval)) 
    { 
     retval = type.Name; 
    } 

    return retval; 
} 

それは各ジェネリック型パラメータに再帰的に動作し、近いコード表現へだ形式で完全な名前を作成します。私たちの目的には十分です(ここでメッセージを記録するのに使用されています)。ジェネリックスや配列を扱うことはできますが、Entity Frameworkプロキシはうまく処理されません。

+0

はい、このアプローチには良い方法だと思います。多次元配列(新しいList [1,2]などはリスト [、])を出力する必要がありますが、サポートしていない点がいくつかあります。さもなければよく見える –

+0

十分に真実。ただし、多次元配列のサポートを追加することはあまり難しくありません。次元の数を取得し、その数のカンマから括弧の間に1を引いたものを追加します。そのようなことをサポートする必要はありませんでした。私たちのコードではIIRCを使用していないからです。 – Amy

関連する問題