2009-10-19 61 views
0

我正在经历Getting Started(与PostSharp无效编译器生成的.NET类名称

当我看到PostSharp注射(被这个表达式是正确?)的一方面的代码到组件中,
我看到这个名字古怪班级标有CompilerGeneratedAttributealt text

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

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


[更新] 我做了一些测试,它看起来像我是能够生成类型的有趣的名字。 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); 
     } 
    } 
} 

回答

8

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

+1

+1,但我认为你的意思是IL,而不是CLR。编译器为匿名类创建''''''。 – 2009-10-19 01:42:51

+0

@itowson:我将利用这个机会创建一个滥用动态类型名称。 ;) – Sung 2009-10-19 02:54:53