将标签及其各自的值添加到对象

时间:2013-12-07 05:00:48

标签: c# .net c#-4.0 dictionary

假设我们有一个名为“Tag”的类。

public class Tag
{
    public string Name { get; private set; }
    public string Description { get; private set; }
    public Type Type { get; private set; }

    public Tag(string name, string description, Type type)
    {
        this.Name = name;
        this.Description = description;
        this.Type = type;
    }
}

标签实例的一个例子是:

Tag weightTag = new Tag("Weight", "Weight of item in kg", typeof(double))

接下来假设我有另一个具有这些标签集合的类,其中与该对象相关的值映射到集合中的每个单独标签。

public class Item
{
    public string Id { get; private set; }
    public string Name { get; private set; }
    public string Description { get; private set; }

    public Dictionary<Tag, object> Tags { get; private set; }

    public Item(string name, string description)
    {
        this.Name = name;
        this.Description = description;

        this.Tags = new Dictionary<Tag, object>();
    }

    public void AddTag(Tag tag, object value)
    {
        Tags.Add(tag, value);
    }
}

我喜欢这种方法,因为您可以从某些位置获取一些预定义标签,然后只需指定一个值。

Tag buildDateTag = TagProvider.GetByName("BuildDate");
Tag weightTag = TagProvider.GetByName("Weight");

item.AddTag(buildDateTag, new DateTime(2013,12,06);
item.AddTag(weightTag, 10.5);

这种方法的缺点是会有很多装箱/拆箱。例如,如果我有一个Item的集合,并且我想要对与权重相对应的标签的所有值求和,那么我必须执行以下操作:

  double totalWeight = 0d;
  foreach (var item in items)
  {
      if (Tags.ContainsKey(weightTag))
      {
          totalWeight += (double)Tags[weightTag];
      }
  }

在这种情况下,我碰巧知道我将要加倍,因此唯一的性能损失是拆箱。但是,在某些情况下,我需要从Tag对象的Type成员中获取对象的类型,以便弄清楚值对象的类型。

我的问题是你认为有更好的方法来构建它,以便摆脱每次我想使用值时依赖于使用对象和拆箱的需要吗?

虽然这应该是一个不同的问题,但在这种用法中,Tag应该是一个结构而不是一个类吗?

1 个答案:

答案 0 :(得分:0)

恕我直言,您可以使用一个界面,该界面具有您期望作为可以标记的对象的一部分的对象的一些共同属性。

在这种情况下,您可以接受任何实现您的界面的对象,因此,您将拥有一个整洁和清洁的代码

示例: class BuildDateTag:ITaggable {       int id;       字符串名称;       双重; }

这样,您可以在Item类中定义标记 public Dictionary<Tag, object> Tags { get; private set; } public Dictionary<Tag,ITaggable> Tags{get;set;}

考虑这一点,并将查询和您的可行性发布到此建议