我有一个数据对象,它有一个带有三个派生类的基类,
public enum ModelType
{
A,
B,
C
}
public abstract class Parent
{
protected ModelType type;
}
public class ChildA: Parent
{
private new ModelType type = ModelType.A;
}
public class ChildB: Parent
public class ChildC: Parent
相同的type
字段位于其他2个具有相应ModelType
s的子项中。
我在表单之间有另一个层,它有一些关于数据对象的更高级别的附加信息和Parent()
的实例。我正在努力简化问题,所以如果我不清楚并且没有提供足够的信息,我会道歉。
public enum UIModelType
{
A,
B,
C,
None
}
public class DataObject
{
private Parent someData;
private UIModelType type;
}
这些字段具有getter和setter属性。
UI仅与DataObject
类通信,无法看到较低级别someData
对象。
现在,在UI(用于填写数据对象中的信息的向导)的某个时刻,用户可以选择A
,B
或C
。我的问题是如何在没有太多代码重复的情况下传递这些信息。现在我在UI和DataObject
类之间有一个枚举。因此,如果用户选择A
,则会使用枚举将数据类型指定为A
。 DataObject
类现在使用someData
实例化ChildA()
对象。问题是在DataObject
和someData
对象之间进行通信我有另一个枚举A,B和C来传达类型。
使用typeof会更健康吗,虽然我已经读过这不是最好的方法。
我需要从UI一直到较低级别的数据对象进行数据类型(ABC)的许多相等检查,因此我认为枚举是最快的方式,但是有这么多感觉不对不同类中相同类型的枚举。我错过了一些非常明显的东西吗?
答案 0 :(得分:0)
您可以使用typeof
而不是enum
或is
。
private Parent someData = new ChildA();
if (someData is Parent) { } // Returns true.
if (someData is ChildA) { } // Returns true.
if (someData is ChildB) { } // Returns false.
但是,如果我正确理解您的问题,听起来您正在进行这些检查,因为您需要不断向下转换someData
对象,以便为DataObject
类提供依赖于类型的功能someData
。如果是这种情况,您可能需要考虑重构代码,因为重复的向下转换可能会使代码难以阅读并违反一些传统的面向对象编程概念。
编辑:
好的,我想我现在更了解你的问题。您正在寻找一种更好的方法来创建Parent
对象的子项(即使用工厂模式),而不是使用enum
。
您可以根据类型名称动态创建实例:
var typeName = GetTheTypeTheUserWants();
var type = System.Type.GetType(typeName, false, true);
if (type == null) throw new Exception();
var someData = Activator.CreateInstance(type) as Parent;
if (someData == null) throw new Exception();
使用enum
可能会更容易,但是此方法允许您在不更新Parent
的情况下创建enum
的新子类。
如果我仍然错过了你的问题,抱歉。
答案 1 :(得分:0)
只需使用'typeof'并完成它。听起来你只是使用枚举,因为你可能获得的性能略有提高。只需使用最易于阅读/维护的代码(在这种情况下为typeof)。
我认为您不必担心向导中的性能,因为最慢的部分是用户选择他们想要的对象类型。
答案 2 :(得分:0)
我会摆脱ModelType
。您只是创建另一种方式来表示您已经拥有的信息,这对维护起来很烦人。
在DataObject
课程中,您的UIModelType
也可能会消失。无论你认为你打算使用它,都可能被替换为:
if (this.someData is ChildA) {
} else if (this.someData is ChildB) {
} ...