0

はじめに(PostSharpを使用)を実行していました

そして、PostSharpが(この式は正しいですか?)アスペクトコードがアセンブリに注入されているのを見たとき、
この奇妙な名前のクラスが。でマークされているのを見ましたCompilerGeneratedAttribute代替テキスト

名前は<>AspectsImplementationDetails_1
私の知る限り、クラス名をで始めることはできません<>
しかし、PostSharpがそのようなクラスを作成することはどのように可能ですか?

<>ある種の未知の/内部オペレーターですか?


[更新] いくつかのテストを行いましたが、興味深い名前の型を生成できたようです。 代替テキスト

使用したサンプルコードは次のとおりです

using System;
using System.Reflection;
using System.Reflection.Emit;

namespace ReflectionDemo
{
    class Program
    {
        public static void Main(string[] args)
        {
            var typeNames = new[] 
            {
                "<>", "-", "+", "~", "!", "@", "#", "$", "%", "^", "&", 
                "*", "(", ")", "="
            };
            const string assemblyName = "Test";
            foreach (var typeName in typeNames)
            {
                PrintTypeName(
                    BuildType(assemblyName, typeName).CreateType());
            }
        }

        private static void PrintTypeName(Type type)
        {
            Console.WriteLine("TypeName = '{0}'", type.FullName);
        }

        private static TypeBuilder BuildType(
            string assemblyName, string typeName)
        {
            var name = new AssemblyName(assemblyName);
            var assemblyBuilder = 
                AppDomain.CurrentDomain.DefineDynamicAssembly(
                    name, AssemblyBuilderAccess.Run);
            var moduleBuilder = 
                assemblyBuilder.DefineDynamicModule(name.Name, false);
            return moduleBuilder.DefineType(
                typeName, TypeAttributes.Public);
        }
    }
}
4

1 に答える 1

8

C#ソースコードに。で始まる名前を含めることはできません<>。ただし、CLR名には自由度が高いため、コンパイラー(C#コンパイラーやPostSharpなど)はそのような名前を生成できます。これは、コンパイラによって生成された名前がソースコードで使用する名前と衝突しないようにするために非常に便利です。また、匿名型や自動プロパティのバッキングフィールドなど、C#コンパイラ自体によって生成されたものも表示されます。

于 2009-10-19T01:40:27.247 に答える