作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想将一些 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 在语义上似乎更彻底。
最佳答案
在第一个选项中,您实际上是在复制信息(类型 + 枚举),没有明显的好处。因此,鉴于这两个选项,我会选择第二个,尽管我更喜欢更惯用的 is
而不是 GetType
比较:
BaseType x = BaseType.ParseXml(xml);
if(x is TypeA)
{
// do work on Type A
}
else if(x is TypeB)
{
// do work on Type B
}
但是,您可以考虑第三种选择:
BaseType x = BaseType.ParseXml(xml);
x.DoWork();
DoWork
是 BaseType 的抽象方法,在 TypeA 和 TypeB 中被重写:
public abstract class BaseType
{
public abstract void DoWork();
}
public class TypeA : BaseType
{
public override void DoWork() {
// do work on Type A
}
}
public class TypeB : BaseType
{
public override void DoWork() {
// do work on Type B
}
}
关于c# - 什么更好?枚举还是类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17556351/
我是一名优秀的程序员,十分优秀!