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

时间:2009-10-19 01:35:28

标签: .net reflection aop identifier

我正在浏览Getting StartedPostSharp

当我看到PostSharp注入(这个表达式是否正确?)方面代码到装配中时,我看到这个奇怪命名的类标有CompilerGeneratedAttributealt text

名为<>AspectsImplementationDetails_1 据我所知,类名不能以<>开头。
但PostSharp如何创建这样的类呢?

<>是某种未知/内部运算符吗?


[UPDATE] 我做了一些测试,看起来我能够生成有趣名字的类型。 alt text

以下是使用的示例代码

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);
        }
    }
}

1 个答案:

答案 0 :(得分:8)

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