我正在浏览Getting Started(PostSharp)
当我看到PostSharp注入(这个表达式是否正确?)方面代码到装配中时,我看到这个奇怪命名的类标有CompilerGeneratedAttribute
。
名为<>AspectsImplementationDetails_1
据我所知,类名不能以<>
开头。
但PostSharp如何创建这样的类呢?
<>
是某种未知/内部运算符吗?
[UPDATE] 我做了一些测试,看起来我能够生成有趣名字的类型。
以下是使用的示例代码
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);
}
}
}
答案 0 :(得分:8)
C#源代码不能包含以<>
开头的名称。但是CLR名称有更多的自由,因此编译器(如C#编译器和PostSharp)可以生成这样的名称。这非常有用,因为它可以确保编译器生成的名称永远不会与您在源代码中使用的名称冲突。您还将看到它们由C#编译器本身生成,例如对于匿名类型或自动属性的支持字段。