【发布时间】:2013-07-07 12:56:38
【问题描述】:
假设我想将一些 xml 解析成一个强类型的类。当我得到xml时,我不知道它应该是A型还是B型,直到我打开它并查看它。我可以看一下,然后返回一个像这样的枚举:
BaseType x = null;
TypeInfoEnum typeInfo = BaseType.GetTypeInfo(xml);
if(typeInfo == TypeInforEnum.TypeA)
{
x = BaseType.ParseXmlToTypeA(xml);
// do other work on Type A
}
else if(typeInfo == TypeInfoEnum.TypeB)
{
x = BaseType.ParseXmlToTypeB(xml);
// do other work on Type B
}
或者我可以只用一种方法处理解析并检查类型:
BaseType x = BaseType.ParseXml(xml);
if(x.GetType() == typeof(TypeA))
{
// do work on Type A
}
else if(x.GetType() == typeof(TypeB))
{
// do work on Type B
}
只是想从您喜欢的设计角度了解其他人的想法。现在,细节不是很重要。我只是根据 xml 中的内容从单个 XML 源创建 2 种不同的类型。没什么复杂的。
更新:
感谢到目前为止的回答。类型在这里并不重要,但作为示例,类层次结构可能如下所示:
class BaseType
{
public string CommonData { get; set; }
}
class TypeA : BaseType
{
public string TypeASpecificData { get; set; }
}
class TypeB : BaseType
{
public string TypeBSpecificData { get; set; }
}
由于此功能将被整合到其他人将使用的程序集中,我喜欢使用 Enum 的第一个选项,因为让 API 的用户检查某物的类型似乎很尴尬,即使用 Enum 在语义上似乎更彻底。
【问题讨论】:
-
您能否举例说明 TypeA 和 TypeB 类的外观?
-
我猜只是一个错字,但仍然:if(typeInfo == TypeInforEnum.TypeA) one r too many
-
@Master117 太多什么?
-
我会使用第一种方式,在解析之前总是检查以节省时间,我也认为在这里切换会非常好,但我仍然有点困惑 BaseType 如何有 2 种不同的类型,如第一个例子。
-
关于您的评论,我宁愿通过界面查看它:
if (myBaseTypeInstance is ITypeB) { }或等效项。至少这样,如果您有任何理由将TypeASpecificData和TypeBSpecificData组合成一个共享类,您可以这样做。但也许这对你来说不是问题。我认为调用者检查反序列化类型的类型没有理由感到尴尬(尽管调用者事先知道他们期望什么并利用泛型可能更有意义,但是可能超出您的设计范围;如果更有意义,您可以更改)
标签: c# .net oop design-patterns types