使用这些类
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方法中传入或执行什么来重建子对象属性?
答案 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)
我要说的最好的方法是用简单的字典替换Parent
和Child
类,这样就可以根据需要包含任意数量的属性。这可以很容易地迭代,并包含您的消息中需要的任何信息。
我建议不要将Process
方法作为参数使用类型,而是将其设为通用 - 约束为IParent
。电话会变成:
Library.Handler.Process(ex);
声明为:
public void Process<TMessageType>(T message) where TMessageType : IParent
{
ScreenRecorder.Start();
message.Print();
}
如上所述,您的IParent接口将包含一个名为Print
的方法,该方法在您的基类父类中将打印您在上面定义的ParentInt属性,并根据需要进行格式化。然后,孩子将看起来与现在一样,并额外覆盖Print
。
这使您可以保留当前的结构。
第三种,最差的方法是按原样使用当前结构并反映属性。你的DoSomething
方法将变得一团糟,也许相当慢(可能不重要)。这需要最少的重新设计,但代价是相当糟糕的代码。
这些方法中的任何一种都可以,但我必须强调,它们所呈现的顺序与其质量有很大关系。