2011-06-09 111 views
5

这听起来有点愚蠢,但我仍然对社区的想法感到好奇。
所以我有一个WebService返回一个UpdateInfo类。
现在考虑下面的定义C#类型设计问题

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK 
} 
public class FileUpdateInfo 
{ 
    public string FileName; 
    public string FileDownLoadURI; 
    public TTCFileType FileType; 
} 
public class UpdateInfo 
{ 
    public FileUpdateInfo fuInfo; 
    //Other 
} 

这里是问题,如果TTCFileType的值为对勾标记,然后我需要另一个枚举即对勾标记类型(BIZ逻辑要求这些信息)。我想知道什么是最好的方式来表达。我不想在这里我有一些像

UpdateMethod(UpdateInfo ui, TickMarkType tt) 

,我检查是否ui.fuInfo.FileType == TTCFileType.TICKMARK
我想我试图找到一个半优雅的方式至少代表为获得第二块的条件要求TT的方法签名信息了(在很多方面,这让人想起了VARIANTS,如果var.VT == VT_ [thingy]然后使用vt。[thingy]和是的,我知道c#开发人员对工会的感受如何:-)
无论如何,好奇的是,如果有漂亮的方法来做到这一点 谢谢

+0

你可以使用'可空'又名'TickMarkType?',那么你可以通过在如果不使用它,而不是随机的'TickMarkType'。虽然我不确定这究竟是什么。 – 2011-06-09 07:10:18

+0

嗯不知道这是否是我想要的,在很多方面,像我说的,我只是觉得它有趣,它不是一些火箭科学类型的问题,我只能说,是的,你将不得不采取一种类型的价值,你会除非另一个参数等于某个值,否则忽略。WIN32 API充满了这样的东西,如果dwParamthing是-1,那么pszPointer将被忽略,等等,所以它没有错,这只是想知道是否有更好的 – Rahul 2011-06-09 07:13:23

回答

0

理想情况下,你需要两个额外的结构(S)

public enum TickmarkType 
{ 
    TYPE1=0, 
    TYPE2 
} 

public class TickMarkFileUpdateInfo : FileUpdateInfo 
{ 
    public TickmarkType type; 
} 

,然后阅读有关polymorphism in web services

1

只包括TickMarkType字段FileUpdateInfo课?

+0

yup看起来虽然最简单,尽管如果第一个枚举值不是TICKMARK。我知道我知道浪费并不多:-)。在所有诚实中,这可能是我会与:-) – Rahul 2011-06-09 07:15:21

0

将枚举值存储为int。为第二枚枚举值(例如1000)添加一些偏移量,以便如果该值来自第一枚枚举,则该枚举值为0..2,如果它来自第二枚枚举值则为1000.1010或其他值。然后你可以设置2个属性,一个返回一个可为空的TTCFileType,另一个返回一个可空的TickType,以读取和写入到int字段中的值。

+0

嗯有趣的非常有趣。我确实相信这很聪明 – Rahul 2011-06-09 07:16:20

1

我会忍不住去的东西,如:

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK_TYPE1 = 100, 
    TICKMARK_TYPE2 = 101, 
    TICKMARK_TYPE3 = 102 
} 

等。取决于你的代码在更广泛的范围内会有多少和可以管理多少。

+0

我也会这样做。我们对日志条目类型有很大的枚举 - 我们按照上面的方法对它们进行分类(尽管在1000,2000,3000条的情况下) – christofr 2011-06-09 07:30:31

0

看起来你试图只使用数据结构,当使用面向对象的功能(如继承)可能会帮助你。也许这个示例代码给你一些想法:

public class Update 
{ 
    // ... ? 
} 

public class FileUpdate : Update 
{ 
    public virtual string Name { get; set; } 
    public virtual string DownloadUri { get; set; } 
    public virtual bool IsTickMarked { get; set; } 
} 

public class ApiFileUpdate : FileUpdate 
{ 
    // ... 
} 

public class BookmarkFileUpdate : FileUpdate 
{ 
    // ... 
} 

你仍然可以序列化这些,给定正确的序列化属性。

实际上,您可以在这些不同的类上定义(可能是虚拟的)方法,并且实际使用它们来实现您的程序。

过分隔离您的数据和代码称为Anemic Domain Model Anti-Pattern