如何获取对调用方法的Window的引用,并使用它来分配所有者?

时间:2013-04-04 15:12:17

标签: c#

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

我必须创建一个自定义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;
}

2 个答案:

答案 0 :(得分:0)

我现在正在做这样的事情。你需要使用反射。遗憾的是,由于我不熟悉自己,我不能提供太多细节,但这里有一行代码:

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

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

P.S:我在ASP.NET中这样做,但我觉得这不重要,只要程序集与web无关......

答案 1 :(得分:0)

听起来您希望将来电者的实例发送到您的留言框。反思不会给你这个。 Reflection提供有关程序集中的类的元数据。同样,StackFrame也为您提供了元数据(例如,GetMethod为您提供了一个MethodBase,它为您提供了堆栈框架中方法的特征)。

我不知道如何在不要求'this'指针作为参数的情况下获取调用对象的实例。如果你从'Form'派生你的消息类,那么你可以尝试Parent和ParentForm属性,但我不认为这些属性是非Null。