我有一个第 3 方应用程序,它提供了一个具有许多“属性”的对象,这些属性只是(字符串)键和值对。值类型可以是字符串、DateTime、Int32 或 Int64。
我需要创建自己的类来方便地表示该对象。我正在创建一个向客户端提供此对象的 WCF 服务,因此我需要它非常简单和干净。
属性的键将作为 Enum 呈现给客户端(以隐藏第 3 方应用程序的特定键字符串的信息)。但是,我不确定如何表示这些值。以下是一些选项:
选项 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; }
选项 2:将所有属性转换为字符串
public class MyObject
{
public Dictionary<MyAttributeKeysEnum, string> MyAttributes { get; set; }
public string Name { get; set; }
public string Id{ get; set; }
选项 3:将它们保留为对象,让客户费心进行转换和转换
public class MyObject
{
public Dictionary<MyAttributeKeysEnum, object> MyAttributes { get; set; }
public string Name { get; set; }
public string Id{ get; set; }
最佳答案
使用多个词典看起来不太好 :) 但在某些情况下可能会奏效。
如果你绝对确定字符串对所有人来说都足够了——那就选择字符串吧。但是,如果其他一些代码需要对其进行解析 - 这将非常昂贵。
如果您想要一个非常简单直接的解决方案 - 只需使用对象即可。即使它会为值类型引入装箱/拆箱(如果您不操作数千个对象,请忘记它)并且您会丢失有关值的类型信息,但此解决方案可能仍然可以正常工作。
您还可以考虑为一个值引入一个中间类。有点像
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; }
// ...
}
在内部,您可以将您的值存储在原始类型的变量中(int 存储在 int 变量中,string 存储在字符串变量中,等等,即每种类型都有一个单独的变量),然后您可以避免类型转换。您也可以将字典包装在另一个类中,添加一些有用的访问器并使其看起来更好。不过,我不知道这如何适合您的基础设施。
关于c# - 在类中表示类型安全属性包的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575975/