在运行时获取对象的实例名称

时间:2013-12-05 04:37:16

标签: c# object instance

我需要在运行时获取对象实例的名称。我有办法做到这一点,但我认为必须有更好的方法。

假设我有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类,每次实例化子表单时实例化它并在事件内传递值,但这可能会使它比必要的更复杂。

所以问题是,如何获取对象的实例名称以便访问其属性?

6 个答案:

答案 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。