2009-11-13 107 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關鍵字。