2015-09-21 7 views
17

Assembly.GetTypes()を使用する場合は、のタイプが<>c....で始まります。Assembly.GetTypes()は奇妙な型名を返します。 "<> c"

これが匿名の種類などの場合は、私はGoogleに試みました。しかし、本当に良い答えを得ることはできません。

タイプには、これらのタイプを示すプロパティがありますか?私はやりたくないのですif(type.Name.StartsWith("<>"))

+2

これらの型は汎用です –

+13

@EhsanSajjadそれらに対して '<> c'型の型は一般的ではなく、コンパイラ生成クラスです。 –

+3

コンパイラで生成される型命名規則の説明は、http://stackoverflow.com/a/2509524/55847 – LukeH

答えて

27

これはコンパイラによって生成された表示クラスです。あなたはCompilerGeneratedAttributeを探すことによって、それらを区別することができます

var attr = Attribute.GetCustomAttribute(type, typeof(CompilerGeneratedAttribute)); 
2

これらはCompilerGeneratedAttribute Class

は、ユーザーが生成し 要素からコンパイラが生成した要素を区別しています。このクラスは継承できません。

あなたは彼らがyieldによって生成される匿名型が、またIEnumerable<T>IEnumerator<T>IEnumerableIEnumeratorの実装を含めるとなり、コンパイラ生成された型、だ

using System.Runtime.CompilerServices; 


bool CompilerGen(Type t) 
{ 
    var attr = Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute)); 
    return attr != null; 
} 
7

のようにそれを確認することができますawaitによって生成されるステートマシン構造。

CompilerGeneratedAttributeがあります。

名前は「奇妙」と記述され、意図的にそのように記述されています。これらはすべて有効な.NET名ですが、一般的な.NET言語、特にC#およびVB.NETでは無効です。つまり、C#コーディングで直接このようなクラスを作成することはできないため、プログラマが一致するクラスを作成していないかどうかを確認するロジックを必要としません。

+1

およびlambdas(特にクロージャ)を参照してください。 C#5の静的なデリゲートにコンパイルされたものでさえ、Roslynのクラスの1つのインスタンス変数になりました(パフォーマンス上の理由から、インスタンスバインドされたデリゲートがCLIで呼び出す方が高速です)。 –

+0

誰かが同じ名前の別のクラスを宣言するとどうなりますか?コンパイラはちょうど別の名前を見つけるだろうか? – IllusiveBrian

+0

@Namfuakどのように?私が言ったように、名前は意図的に有効な.NET名であるが、有効なC#名ではない名前になるように選択されています。 C#クラスは '<'で始まるものを呼び出すことはできません。 –

関連する問題