如何在调用的方法中获取调用对象?
我必须创建一个自定义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;
}
答案 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。