3

我正在尝试使用 Reg Gate 的反射器从程序集中恢复源。原始源代码利用了几个 C# 3.0 特性,这使得恢复起来有点困难。例如,这里是匿名类型的恢复源。弹出的第一件事是类标识符上的 <> 。运行时类型命名规则显然比设计时规则更自由。很公平。一个简单的搜索和替换将解决这个问题。我必须注意哪些其他编译器修改以及如何处理它们?

[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;
        }
    }
}
4

3 回答 3

6

经常用于其中的名称的术语<>难以形容的名称- 因为它们不是有效的 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 中的动态代码创造了各种奇怪而奇妙的东西

如果您在 Reflector (View / Options / Disassembler) 中将“优化”级别调高,它通常会尽力为您提供类似于原始源代码的内容 - 关闭优化以获得有趣的体验 :)

于 2009-11-13T20:58:43.537 回答
1

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

于 2009-11-13T20:55:21.987 回答
0

使用语句也会导致代码的小转换,就像StaticVB.Net 中的关键字一样。

于 2009-11-13T21:00:20.600 回答