【问题标题】:Decompiling .Net code: lambda expressions反编译 .Net 代码:lambda 表达式
【发布时间】:2016-04-16 16:56:46
【问题描述】:

在 Xamarin 程序集浏览器中反汇编类库我的语法无效 in the source

InventoryTab.<DrawResources>c__AnonStoreyF <DrawResources>c__AnonStoreyF = 
    new InventoryTab.<DrawResources>c__AnonStoreyF ();

这样的输出对应什么代码?

编辑 1

lambda(感谢 D Stanley)反汇编的整个相关部分是

InventoryTab.<DrawResources>c__AnonStoreyF <DrawResources>c__AnonStoreyF = 
    new InventoryTab.<DrawResources>c__AnonStoreyF ();

<DrawResources>c__AnonStoreyF.tooltipText = "some string";

if (current.availableCount > -1) {

    InventoryTab.<DrawResources>c__AnonStoreyF arg_432_0 = 
        <DrawResources>c__AnonStoreyF;

    string tooltipText = <DrawResources>c__AnonStoreyF.tooltipText;

    arg_432_0.tooltipText = string.Concat (new string[] {
        tooltipText,
        // and some more strings...
        "\n\n"
    });
}
TipSignal tipSignal = new TipSignal (() => 
    <DrawResources>c__AnonStoreyF.tooltipText, 
    <DrawResources>c__AnonStoreyF.tooltipText.GetHashCode ()
);
TooltipHandler.TipRegion (rect, tipSignal);

现在我想弄清楚 lambda 应该 可能是什么样子的。

编辑 2

TipSignal 定义为

public TipSignal (string text, int uniqueId);

编辑 3

以下代码可以作为 lambda 替换吗?

string tooltipText = "some string";
if (current.availableCount > -1) {
    tooltipText = string.Concat (new string[] {
        tooltipText,
        // and some more strings...
        "\n\n"
    });
}
TipSignal tipSignal = new TipSignal (tooltipText, tooltipText.GetHashCode ());
TooltipHandler.TipRegion (rect, tipSignal);

【问题讨论】:

  • 匿名方法 (lambdas) 和自动实现的属性。

标签: c# .net lambda xamarin disassembly


【解决方案1】:

它不可能“应该”看起来,因为您正在反编译,所以任何给出相同结果的代码都是同样正确的。反编译时不可能知道原始的样子,因为任何反编译都必须在几个可能的输入之间进行猜测,不会包括已删除的死代码,等等。

只需将故意无效的名称(在原始编译中使用以保证不会与开发人员实际使用的名称冲突)更改为有效的名称,例如 DrawResourcesc__AnonStoreyF 并且除非反编译出错(在这种情况下它无论如何都不会工作,尽管如果有什么比这里更容易出错的部分),那么您将拥有工作代码。然后在整理其余部分时整理它,提供更好的名称和/或根据需要将其变成匿名类。

【讨论】:

  • 所以我可以在这里跳过 lambda 并使用一些简单的代码?我不明白为什么在那里使用 lambda,所以感觉它比我想象的要复杂......
  • new TipSignal (...)中的lambda是否应该包含之前给出的逻辑?
  • 具有 lambda 或匿名类型的代码(我猜是后者,但可能两者兼而有之)可能更容易编写。反编译未能使用相同的语法糖使结果更甜,而是给了您语法的士的宁。把它变成可编译的东西会给你工作的结果,但不如原来的可读性好(记住,你永远不会比原来的近似值更好),尽管它可以是重构为更好的东西的起点.编辑 3 是否按预期编译和工作?
  • 好的,只是想确保我没有删除任何重要的内容。那部分似乎正在编译,但在整个编译之前我还有一些错误需要解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多