编译器生成的.NET类名无效

dan*_*die 0 .net reflection aop identifier

我正在通过入门(使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ito*_*son 8

C#源代码不能包含以<>.开头的名称.但是CLR名称有更多的自由,因此编译器(如C#编译器和PostSharp)可以生成这样的名称.这非常有用,因为它可以确保编译器生成的名称永远不会与您在源代码中使用的名称冲突.您还将看到它们由C#编译器本身生成,例如,对于匿名类型或自动属性的支持字段.