将有关对象类型的信息从UI传递到数据层

时间:2012-01-20 13:27:20

标签: c# winforms inheritance user-interface

我有一个数据对象,它有一个带有三个派生类的基类,

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(用于填写数据对象中的信息的向导)的某个时刻,用户可以选择ABC。我的问题是如何在没有太多代码重复的情况下传递这些信息。现在我在UI和DataObject类之间有一个枚举。因此,如果用户选择A,则会使用枚举将数据类型指定为ADataObject类现在使用someData实例化ChildA()对象。问题是在DataObjectsomeData对象之间进行通信我有另一个枚举A,B和C来传达类型。

使用typeof会更健康吗,虽然我已经读过这不是最好的方法。

我需要从UI一直到较低级别的数据对象进行数据类型(ABC)的许多相等检查,因此我认为枚举是最快的方式,但是有这么多感觉不对不同类中相同类型的枚举。我错过了一些非常明显的东西吗?

3 个答案:

答案 0 :(得分:0)

您可以使用typeof而不是enumis

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) {

} ...