“呸!” 终于解决了!
这是将来尝试做同样事情的人的解决方案。
创建一个'List'的实例,然后遍历方法并将名称分配给这样的列表,然后每当你的SelectedItem
索引值发生变化时,我可以简单地调用GetMethodBodyByName
,然后我肯定可以解决这个问题
以下是该功能的实现方法GetMethodBodyByName
:
public string GetMethodBodyByName(string methodName)
{
ModuleDefMD md = ModuleDefMD.Load(filename);
foreach (TypeDef type in md.Types)
{
foreach (MethodDef method in type.Methods)
{
for (int i = 0; i < type.Methods.Count; i++)
{
if (method.HasBody)
{
if (method.Name == methodName)
{
var instr = method.Body.Instructions;
return String.Join("\r\n", instr);
}
}
}
}
}
return "";
}
这个想法是'GetMethodBodyByName'将接收方法名称作为参数,然后它将遍历方法并查看方法是否与给定名称匹配,然后如果找到,该函数将简单地遍历该方法并输出方法的主体.
这是我的ListBox_SelectedItemChanged
活动的样子:
private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBox.Text = "";
textBox.Text = GetMethodBodyByName(method[listBox.SelectedIndex].Name);
}
这就是所有人!
注意:使用这种方法时要小心,就好像在请求名称时,不同的方法可以具有相同的名称。但这是另一天的蛋糕,我现在完成了!保重再见!
为终极解决方案而努力!
WPF MainWindow 窗体本身带有两个有用的小属性,它们是:Tag
和Content
,其想法如下:
使用Tag
andContent
属性,我们可以为它分配任何值,以便以后可以检索它,On-The-Fly
而不必依赖专门用于此任务的方法名称。
因此,您无需循环每个方法并分别获取其名称,而是可以按照我的方式进行:
遍历方法,并将其主体分配给Tag
属性,并将其名称分配给Content
属性,因为最后一个属性是处理实际Title
属性的属性,因此请忽略您将来对该方法所做的任何事情,即使它具有另一个名称相同,无论如何它都会起作用。
我们如何实施它?
简单地:
<...>
// Inside Method Body iteration routine...
<...>
var instr = mdInfo.Body.Instructions;
// Allocate in a new `ListBoxItem` each method and add it to the current listbox with their
// ... respective Tag and Content information... // Many Thanks Kao :D
newItem = new ListBoxItem();
newItem.Content = mdInfo.Name;
newItem.Tag = string.Join("\r\n", instr);
method.Add(mdInfo);
listBox.Items.Add(newItem);
然后在您的SelectedItem
Index-Value-Changed Event 上放置:
MSILTextBox.Clear();
// Retrieve them given the selected index...
// ... the returned value will be the Tag content of the ...
// ... previously saved item.
string getTag= ((ListBoxItem)listBox.SelectedItem).Tag.ToString();
MSILTextBox.Text = getTag;