Assembly.GetTypes()
を使用する場合は、のタイプが<>c....
で始まります。Assembly.GetTypes()は奇妙な型名を返します。 "<> c"
これが匿名の種類などの場合は、私はGoogleに試みました。しかし、本当に良い答えを得ることはできません。
タイプには、これらのタイプを示すプロパティがありますか?私はやりたくないのですif(type.Name.StartsWith("<>"))
Assembly.GetTypes()
を使用する場合は、のタイプが<>c....
で始まります。Assembly.GetTypes()は奇妙な型名を返します。 "<> c"
これが匿名の種類などの場合は、私はGoogleに試みました。しかし、本当に良い答えを得ることはできません。
タイプには、これらのタイプを示すプロパティがありますか?私はやりたくないのですif(type.Name.StartsWith("<>"))
これはコンパイラによって生成された表示クラスです。あなたはCompilerGeneratedAttribute
を探すことによって、それらを区別することができます
var attr = Attribute.GetCustomAttribute(type, typeof(CompilerGeneratedAttribute));
これらはCompilerGeneratedAttribute Class
は、ユーザーが生成し 要素からコンパイラが生成した要素を区別しています。このクラスは継承できません。
あなたは彼らがyield
によって生成される匿名型が、またIEnumerable<T>
、IEnumerator<T>
、IEnumerable
とIEnumerator
の実装を含めるとなり、コンパイラ生成された型、だ
using System.Runtime.CompilerServices;
bool CompilerGen(Type t)
{
var attr = Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute));
return attr != null;
}
のようにそれを確認することができますawait
によって生成されるステートマシン構造。
CompilerGeneratedAttribute
があります。
名前は「奇妙」と記述され、意図的にそのように記述されています。これらはすべて有効な.NET名ですが、一般的な.NET言語、特にC#およびVB.NETでは無効です。つまり、C#コーディングで直接このようなクラスを作成することはできないため、プログラマが一致するクラスを作成していないかどうかを確認するロジックを必要としません。
およびlambdas(特にクロージャ)を参照してください。 C#5の静的なデリゲートにコンパイルされたものでさえ、Roslynのクラス
誰かが同じ名前の別のクラスを宣言するとどうなりますか?コンパイラはちょうど別の名前を見つけるだろうか? – IllusiveBrian
@Namfuakどのように?私が言ったように、名前は意図的に有効な.NET名であるが、有効なC#名ではない名前になるように選択されています。 C#クラスは '<'で始まるものを呼び出すことはできません。 –
これらの型は汎用です –
@EhsanSajjadそれらに対して '<> c'型の型は一般的ではなく、コンパイラ生成クラスです。 –
コンパイラで生成される型命名規則の説明は、http://stackoverflow.com/a/2509524/55847 – LukeH