0

如何在被调用方法中获取调用对象?

我必须创建一个自定义 MessageBox,创建如下:

public static class MsgBox
{
    public static MessageBoxResult Show(string messageBoxText)
    {
        var msg = new CustomMessageBoxWindow(messageBoxText);
        msg.ShowDialog();

        return msg.Result;
    }
}

我现在需要为这个 MessageBox 指定一个所有者。我可以通过强制开发人员传入调用对象来做到这一点,例如

public static MessageBoxResult Show(string messageBoxText, Window owner)

并将所有者设置如下

msg.Owner = owner;

但这意味着必须在很多地方改变很多电话。这是可行的,但并不理想。理想情况下,我可以从 Show() 方法中找出哪个类称为 MessageBox 并设置它,而无需传递任何新参数,例如

public static MessageBoxResult Show(string messageBoxText)
{
    var msg = new CustomMessageBoxWindow(messageBoxText);
    msg.ShowDialog();

    var owner = // somehow get the calling Window;
    msg.Owner = owner;

    return msg.Result;
}
4

2 回答 2

0

我目前正在做这样的事情。您将需要使用反射。不幸的是,我不能提供太多细节,因为我自己是反思的新手,但这里有一行代码:

new System.Diagnostics.StackFrame(2).GetMethod().DeclaringType.ToString();

从我看到的地方,这将 2 个级别向上移动到堆栈跟踪(在我的代码中,我需要 2 个级别,也许您需要更多?)。然后 GetMethod 返回调用方法,而 DeclaringType 属性为您提供声明此方法的类。我知道它不一定能解决你的问题,但也许这可以帮助......

PS:我在 ASP.NET 中执行此操作,但我认为这并不重要,只要程序集与 Web 无关...

于 2013-04-04T15:18:09.897 回答
0

听起来你想要调用者的实例到你的消息框。反射不会给你这个。反射提供有关程序集中类的元数据。同样,StackFrame 也为您提供元数据(例如,GetMethod 为您提供 MethodBase,它为您提供堆栈框架中方法的特征)。

我不知道有一种方法可以获取调用对象的实例,而无需将其“this”指针作为参数。如果您从“表单”派生消息类,那么您可以尝试 Parent 和 ParentForm 属性,但我不认为这些是非 Null 的。

于 2013-04-04T18:48:51.130 回答