2009-11-13 79 views
2

我正在尝试使用Reg Gate的Reflector从程序集中恢复源代码。原始资源利用了几个C#3.0功能,这使得它有点难以恢复。例如,这里是匿名类型的恢复源。弹出的第一件事是在类标识符上输入from。运行时类型命名规则显然比设计时间规则更自由。很公平。一个简单的搜索和替换将解决这个问题。我还需要注意哪些其他编译器问题,以及如何处理它们?编译生成Cruft

[DebuggerDisplay(@"\{ OverrideType = {OverrideType}, EntityType = {EntityType} }", Type="<Anonymous Type>"), CompilerGenerated] 
internal sealed class <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar> 
{ 
    [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    private readonly <EntityType>j__TPar <EntityType>i__Field; 
    [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
    private readonly <OverrideType>j__TPar <OverrideType>i__Field; 

    [DebuggerHidden] 
    public <>f__AnonymousType1(<OverrideType>j__TPar OverrideType, <EntityType>j__TPar EntityType) 
    { 
     this.<OverrideType>i__Field = OverrideType; 
     this.<EntityType>i__Field = EntityType; 
    } 

    [DebuggerHidden] 
    public override bool Equals(object value) 
    { 
     var type = value as <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>; 
     return (((type != null) && EqualityComparer<> <<OverrideType>j__TPar>.Default.Equals(this.<OverrideType>i__Field, type.<OverrideType>i__Field)) && EqualityComparer<<EntityType>j__TPar>.Default.Equals(this.<EntityType>i__Field, type.<EntityType>i__Field)); 
    } 

    [DebuggerHidden] 
    public override int GetHashCode() 
    { 
     int num = -338316509; 
     num = (-1521134295 * num) + EqualityComparer<<OverrideType>j__TPar>.Default.GetHashCode(this.<OverrideType>i__Field); 
     return ((-1521134295 * num) + EqualityComparer<<EntityType>j__TPar>.Default.GetHashCode(this.<EntityType>i__Field)); 
    } 

    [DebuggerHidden] 
    public override string ToString() 
    { 
     StringBuilder builder = new StringBuilder(); 
     builder.Append("{ OverrideType = "); 
     builder.Append(this.<OverrideType>i__Field); 
     builder.Append(", EntityType = "); 
     builder.Append(this.<EntityType>i__Field); 
     builder.Append(" }"); 
     return builder.ToString(); 
    } 

    public <EntityType>j__TPar EntityType 
    { 
     get 
     { 
      return this.<EntityType>i__Field; 
     } 
    } 

    public <OverrideType>j__TPar OverrideType 
    { 
     get 
     { 
      return this.<OverrideType>i__Field; 
     } 
    } 
} 

回答

5

这个名词经常用于<>其中的名字是难以名称的名字 - 因为它们不是有效的C#。这可以防止它们与非编译器生成的名称冲突,并阻止您尝试在C#中引用它们。

有些东西可能会导致他们:

  • 迭代器块产生嵌套类型来实施。

  • 数组初始如:

    int[] x = new int[] { 1, 2, 3 }; 
    

    将生成一个<PrivateImplementationDetails>{...}类。 (但仅适用于某些类型。)

  • Lambda表达式可以创建一个用来缓存委托和表达式树在可能

  • 如果用调试信息编译新的方法和新的类型来实现逻辑和静态变量开启,收集和对象初始值设定项,如:

    List<string> list = new List<string> { "hello", "there" }`) 
    Button button = new Button { Text = "Hi" }; 
    

    将导致生成带有无法形容名称的局部变量。 (在分配给实际变量之前,它们用于保存临时值,而属性被分配和添加项目。)

  • C#4中的动态代码创建各种奇怪和美妙的东西

如果你把“优化”级别最高的反射器(查看/选项/反汇编),它通常会尽力给你的东西像原来的源代码 - 把优化关闭了一个有趣的体验:)

+1

对象初始值设定项还会产生一个额外的编译器生成的变量,其名称为* unspeakable * – 2009-11-13 21:06:53

+0

@Winston:良好的捕获,将编辑它。 – 2009-11-13 21:10:59

1

捕获变量的Lambdas导致由类似自动创建的类型表示的闭包。

0

使用语句还会导致代码的小型转换,就像关于VB.Net中的Static关键字。