1

想象一下,我有一个普通班Person。然后我有那个类的专业,例如DanishPersonBritishPerson

现在我需要一个函数来返回正确的 Persons 实例,具体取决于他们所在的国家/地区,或者一种轻松确定他们是什么类型的人的方法。所以我有这个功能:

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

人员列表包含类型为DanishPerson的对象BritishPerson。根据类型,我需要在我的 UI 中显示正确的 ViewModel。因此,如果列表包含类型为 的丹麦人DanishPerson,我需要显示一个 UI 来显示丹麦特定属性(以及更多)。

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

4

3 回答 3

2

您可以使用 aDictionary<K, V>来存储国家代码和关联的类类型之间的映射,然后使用 LINQ 方法OfType仅获取与提供的国家代码关联的类型的实例。

于 2010-08-19T08:19:36.903 回答
1

您可以使用 Dictionary 根据人员类型映射行为。最好创建一个 Ibehaviour 接口并从中继承两个类,一个用于 British,一个用于丹麦,并封装两者之间的不同行为。

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

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

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
于 2010-08-19T08:21:45.697 回答
0

如果 List 对象是同质的(即它总是只填充丹麦人或英国人对象,那么这个小 LINQ 小道消息将起作用:

var list = GetPersonsByCountry(1);
if (list.OfType<BritishPerson>().Any())
     ShowBritishUI();
else
     ShowDanishUI();
于 2010-08-19T08:21:16.823 回答