在类中表示类型安全属性包的最佳方法是什么?

yel*_*ood 11 c# oop wcf propertybag

我有一个第三方应用程序,它为对象提供了许多"属性",它们只是(字符串)键和值的对.值类型可以是字符串,DateTime,Int32或Int64.

我需要创建自己的类来以方便的方式表示此对象.我正在创建一个向客户端提供此对象的WCF服务,因此我需要它非常简单和干净.

属性的键将显示为客户端的枚举(以隐藏第三方应用程序的特定键字符串的信息).但是,我不确定如何表示这些值.以下是一些选项:

选项1:每个属性值有不同的集合,看起来很难看,但客户很容易使用

public class MyObject
{
    public Dictionary<MyTextAttributeKeysEnum, string> TextAttributes { get; set; }
    public Dictionary<MyDateAttributeKeysEnum, DateTime> DateAttributes { get; set; }
    public Dictionary<MyNumAttributeKeysEnum, long> NumericAttributes { get; set; }

    public string Name { get; set; }
    public string Id{ get; set; }
Run Code Online (Sandbox Code Playgroud)

选项2:将所有属性转换为字符串

public class MyObject
{
    public Dictionary<MyAttributeKeysEnum, string> MyAttributes { get; set; }

    public string Name { get; set; }
    public string Id{ get; set; }
Run Code Online (Sandbox Code Playgroud)

选项3:将它们保留为对象,让客户为铸造和转换而烦恼

public class MyObject
{
    public Dictionary<MyAttributeKeysEnum, object> MyAttributes { get; set; }

    public string Name { get; set; }
    public string Id{ get; set; }
Run Code Online (Sandbox Code Playgroud)

tti*_*til 5

使用几个字典看起来不太好:)但可能在某些情况下有效.

如果你完全确定字符串对所有人来说都足够了 - 请使用字符串.但是如果其他一些代码需要解析它 - 这将是昂贵的.

如果你想要一个非常简单的直接解决方案 - 只需使用对象.即使它会为值类型引入装箱/拆箱(如果你不操作数千个对象就忘了它)并且你丢失了值的类型信息,这个解决方案可能仍然可以正常工作.

您也可以考虑为值引入中间类.就像是

public Dictionary<MyAttributeKeysEnum, PropertyBagValue> MyAttributes { get; set; }

public class PropertyBagValue
{
    public object AsObject { get; set; }
    public string AsString { get; set; }
    public int AsInt { get; set; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在内部,您可以将值存储在原始类型的变量中(int变量中的int,字符串变量中的字符串等,即每种类型都有一个单独的变量)然后您可以避免类型转换.您还可以将字典包装在另一个类中,添加一些有用的访问器并使其看起来更好.我不知道这如何适合您的基础设施.