代码之家  ›  专栏  ›  技术社区  ›  Tommy Jakobsen

类型专门化;如何确定每个特定类型并对其作出反应?

  •  1
  • Tommy Jakobsen  · 技术社区  · 14 年前

    想象一下我有一个普通班 Person . 例如,我有那门课的专门课 DanishPerson BritishPerson .

    现在,我需要一个函数返回正确的人员实例,这取决于他们所处的国家,或者一种轻松确定他们是哪种类型的人员的方法。所以我有这样的功能:

    List<Person> GetPersonsByCountry(int countryId)
    {
        // query database, and get list of Persons in that country using EF inheritance
        // return list of persons
    }
    

    人员列表,包含以下对象: 任何一个 类型的 丹尼斯人 英国人 . 根据类型的不同,我需要在我的用户界面中显示正确的视图模型。因此,如果列表中包含丹麦人类型 丹尼斯人 ,我需要显示一个将显示丹麦特定属性(以及更多)的UI。

    现在我的问题是你是如何做到最好的?我想我总是可以使用if/else typeof 但我希望能有一种更优雅,也许更普通的方式? 我在想,在处理专业化时,可能会有一些这样做的模式,因为这对我来说似乎是一个常见的问题?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Dror Helper    14 年前

    您可以使用字典根据人员类型映射行为。 更好的方法是创建一个ibehaviour接口,从中继承两个类:一个用于英国,一个用于丹麦,并封装了这两个类之间的不同行为。

    当添加另一个人类型时,需要创建行为类并更新字典。

    创建字典(类的私有成员):

    Dictionary<Type, IBehaviour> mapper = new Dictionary<Type, IBehaviour>()
    {
       {typeof(BritishPerson), new BritishPersonBehaviour()},
       {typeof(DanishPerson), new DanishPersonBehaviour()}
    };
    

    在代码中:

    Person person = ...
    var behaviour = mapper[person.GetType()];
    behaviour.ShowUI(); //or something like this
    
        2
  •  2
  •   João Angelo    14 年前

    你可以使用 Dictionary<K, V> 要存储国家代码和关联类类型之间的映射,请使用Linq方法 OfType 仅获取与提供的国家/地区代码关联的类型的实例。

        3
  •  0
  •   cordialgerm    14 年前

    如果列表对象是同质的(即它总是只填充丹麦语或英国人对象),那么这个小linq tiddit将工作:

    var list = GetPersonsByCountry(1);
    if (list.OfType<BritishPerson>().Any())
         ShowBritishUI();
    else
         ShowDanishUI();