需要任何设计思路来过滤对象的属性

时间:2011-06-09 17:43:25

标签: c# .net design-patterns reflection attributes

假设有一个名为HouseHoldItems的类。它可能有许多不同的项目,如

Class HouseHoldItems
{ 
  TV,
  Fridge,
  Hammer,
  Chair,
  Watch,
  Shoes,  
}

我想要一种方法来提出一种模式,我可以指定一些项目,如'电子','布基','铁','电'。然后我希望能够获得电子项目清单等等。

我们的业务实体位于其上,我们指定的项目是可过滤的,可搜索的,用户可以看到与否以及其他类似的行为。在UI中,我们有相应显示每个列表的屏幕。

我想提出一个通用设计和一种方法,通过它我可以将这些特征应用于我的对象的属性。就目前而言,我可以在脑海中想到“属性”和“反思”来实现这一目标,但想知道是否存在任何已知的模式,这些模式可能有助于以更好的方式实现这一目标。

由于 摩尼

3 个答案:

答案 0 :(得分:0)

这应该让你朝着正确的方向前进:

public enum Category { Electronic, ClothBased, // etc. }

abstract class HouseholdItem { 
    private readonly Category category;
    public Category Category { get; }
    public HouseholdItem(Category category) {
        this.category = category;
    }
}

class Television : HouseholdItem {
    public Television() : base(Category.Electronic) { }
}

如果需要,您甚至可以将Category变为class

答案 1 :(得分:0)

不要使用属性。属性不应该用于某些业务逻辑,它是机制的一部分。

如果我理解正确,那么您所拥有的是项目与“类别”之间的经典many-to-many关系。有很多方法可以代表这种关系。

如果要将数据存储在关系数据库中,那么最自然的方法是引入一个将一个项目与一个类别链接在一起的对象。每个项目可能存在很少这样的对象。这就是关系数据库中呈现多对多关系的方式。

如果您只需要在运行时存储此关系,则只需将类别列表添加为Item类的字段,将类别中的项列表添加为类别类的字段。确保它们在任何时刻都是同步的,它应该足够了。获取所需信息很容易。

因此,关键点是要创建一个类CategoryTag并为每个类别创建一个实例,如“electric”和“clothbased”,那么就是连接两个一起 - 通过双方的直接联系或通过“关系”对象。

答案 2 :(得分:0)

此模式可能是Query pattern。假设你有一个带有条件参数的Select()方法为“Electronic”,它返回所请求项目的列表。

Item[] HouseHoldItems.Select(string criteria);

原因你需要实现这个方法。