我需要在运行时获取对象实例的名称。我有办法做到这一点,但我认为必须有更好的方法。
假设我有4种形式:FormA1,FormA2,FormA2和DormA4。它们都来自FormA。 FormA永远不会被实例化 - 让我们说它是虚拟的。
我也有FormB。每个FormA子项都可以在运行时,在某些事件时,实例化FormB。 FormB的工作是获取一些信息并将其返回到在运行时调用它(实例化它)的表单。但是在不知道调用表单实例的名称的情况下,我无法访问任何调用表单的属性。
我目前的方式是在FormB中有一个构造函数,它使用FormA作为类型引用sender作为参数,例如:
public class FormB : Form
{
private FormA referenceForm;
public FormB(ref FormA callingForm)
{
referenceForm = callingForm;
}
}
这样我可以通过本地方法访问调用表单的属性。当然为了获得特定属性,我需要代码反射,这样我就可以获得正确的类型并访问子代的特定属性。 或者,我认为,我可以创建FormHandler类,每次实例化子表单时实例化它并在事件内传递值,但这可能会使它比必要的更复杂。
所以问题是,如何获取对象的实例名称以便访问其属性?
答案 0 :(得分:2)
您还没有解释为什么以及何时需要这样做,但听起来您正在寻找发布商订阅的模式。您可以使用委托/事件,例如FormB将有趣的事件发布到FormA
public class InterstingInfo
{
// TODO
}
public class FormB
{
public delegate void Callback(InterstingInfo interestingData);
public event Callback observer;
private void NotifyObserver()
{
InterstingInfo interstingInfo = null;
// TODO setup intersting data
observer.Invoke(interstingInfo);
}
}
public class FormA
{
void CreateFormB()
{
FormB formB = new FormB();
formB.observer += (o) => { DoStuffForOtherForm(o); };
}
void DoStuffForOtherForm(InterstingInfo interestingData)
{
// TODO - Do stuff based on 'interstingInfo'
}
}
答案 1 :(得分:1)
这是你想要的吗?
obj.GetType().Name
这会告诉你名字(例如FormA1)
顺便说一下,没有必要在构造函数中使用ref
。
答案 2 :(得分:1)
这不是您问题的直接答案。但是你应该使用委托系统。在FormB中设置一个委托,FormB的实例化器可以为其分配一个动作。您可以通过委托传递所需的参数。
有关详情,请参阅此处:https://stackoverflow.com/a/639366/2696641 Where do I use delegates?
答案 3 :(得分:0)
FormB应该能够在任何地方实例化,理想情况下不关心或知道谁创建它。更好的方法是在FormB中公开您需要的任何属性,并让调用对象读取它们。
答案 4 :(得分:0)
嗯...
我想你要求一个具体的答案。什么时候你应该问一个将军...我该怎么办呢。
我会将FormA所需的所有数据从FormB公开为FormB上的属性。然后我会在FormB上公开一个事件,以便FormA知道何时从B填充自己。
http://msdn.microsoft.com/en-us/library/ak9w5846.aspx
这基本上是GOF Observer模式......
答案 5 :(得分:0)
我想最后我可以在运行时将每个FormAs实例化为相同的名称,无论表单如何,都可以引用该任意单个名称。只要我不同时实例化FormAs。