我可以传递父对象并在函数的另一端重建它吗?

时间:2014-02-25 17:05:26

标签: c# visual-studio-2012 types

使用这些类

public class Parent
{
   public int parentInt;
}

public class Child: Parent
{
   public string childString;

   public Child(string passedString, int passedInt)
   {
       childString = passedString
       parentInt = passedInt
   }     
}

我想写一个像这样的东西的函数:

public static void DoSomething(Parent passedParent, Type passedChildType)
{
    ScreenRecorder.Start()
    //print all of parents properties
    //print all of the specific child's properties if possible

}

我希望这个函数能够处理我将来创建的任何类型的子项,如何才能使它能够在函数内动态重建子项的属性?

以下是被调用方法的示例:

public static int dostuff(string s)
{
    int functionReturnValue = 0;

    switch (s)
    {
        case "":
            functionReturnValue = 0;
            break;
        case "7/8":
            functionReturnValue = 14;
            break;
        case "15/16":
            functionReturnValue = 15;
            break;
        default:
            Child ex = new Child("Blue", 1);
            Library.Handler.Process(ex, typeof(Child));
            break;
    }
    return functionReturnValue;
}

我可以在Dosomething方法中传入或执行什么来重建子对象属性?

2 个答案:

答案 0 :(得分:0)

回答实际问题。是的,你可以在另一边“重建”一个物体。

请参阅此代码以获取示例:

public class Parent
{
    int thing = 1;
}


public class Child1 : Parent
{
    public string name;

    public Child1(string p)
    {
        this.name = p;
    }
}

public class Child2 : Parent
{
    public string name;

    public Child2(string p)
    {
        this.name = p;
    }
}

在这个函数中,我们设置一个Child1对象并将其传递给另一个函数。

    private void SetupStuff
    {
        Child1 x = new Child1("Bob");

        DoStuff(x);
    }

在这里,我们可以接收并“重建它”

    private void DoStuff(Parent obj)
    {
        Child1 rebuiltObject = ((Child1)obj);
        MessageBox.Show(rebuiltObject.name);
    }

MessageBox将显示“Bob”

但请注意,这会导致运行时错误:

    private void DoStuff(Parent obj)
    {
        Child2 rebuiltObject = ((Child2)obj);
        MessageBox.Show(rebuiltObject.name);
    }

它足够聪明,可以防止你重建你的对象,就像从未有过的那样。

答案 1 :(得分:-2)

方法1:消息字典

我要说的最好的方法是用简单的字典替换ParentChild类,这样就可以根据需要包含任意数量的属性。这可以很容易地迭代,并包含您的消息中需要的任何信息。


方法2:接口

我建议不要将Process方法作为参数使用类型,而是将其设为通用 - 约束为IParent。电话会变成:

Library.Handler.Process(ex);

声明为:

public void Process<TMessageType>(T message) where TMessageType : IParent
{
  ScreenRecorder.Start();
  message.Print();
}

如上所述,您的IParent接口将包含一个名为Print的方法,该方法在您的基类父类中将打印您在上面定义的ParentInt属性,并根据需要进行格式化。然后,孩子将看起来与现在一样,并额外覆盖Print

这使您可以保留当前的结构。


方法3:反思

第三种,最差的方法是按原样使用当前结构并反映属性。你的DoSomething方法将变得一团糟,也许相当慢(可能不重要)。这需要最少的重新设计,但代价是相当糟糕的代码。


这些方法中的任何一种都可以,但我必须强调,它们所呈现的顺序与其质量有很大关系。