11

我有一个第 3 方应用程序,它提供一个具有许多“属性”的对象,这些属性只是(字符串)键和值对。值类型可以是字符串、DateTime、Int32 或 Int64。

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

属性的键将作为 Enum 呈现给客户端(以隐藏 3rd 方应用程序的特定键字符串的信息)。但是,我不确定如何表示这些值。以下是一些选项:

选项 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; }
4

2 回答 2

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; }
    // ...
}

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

于 2011-12-20T23:23:03.700 回答
0

如何让您的 DataContract 类抽象并为字典提供您在派生类中需要的类型:

[DataContract]
[KnownType(typeof(My3dPartyObjectString))]
[KnownType(typeof(My3dPartyObjectInt64))]
public abstract class My3dPartyObjectBase
{
// some common properties
}

[DataContract]
public class My3dPartyObjectString : My3dPartyObjectBase
{
public Dictionary<3PAttributeKeysEnum, string> MyStringAttributes { get; set; }
}

[DataContract]
public class My3dPartyObjectInt64 : My3dPartyObjectBase
{
public Dictionary<3PAttributeKeysEnum, long> MyStringAttributes { get; set; }
}

然后客户端必须分析返回对象的真实类型并根据类型获取属性集合。这将接近您的 3d 选项,但客户端至少在响应对象级别具有某种类型安全性。

于 2011-12-20T13:21:42.017 回答