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 回答