2012-07-05 123 views
3

类类型现在,我有一个这样的枚举:返回基于int值

public enum ReferenceType 
{ 
    Language = 1, 
    Period = 2, 
    Genre = 3 
} 

语言,时期和流派是映射回表在我的数据库中的所有实体类。我也有模型类,它们将实体类几乎映射为1,然后我将它们显示在视图中。

我也有这样的服务方法:

List<Model> Get<Model, Entity>() 
     where Model : BaseModel 
     where Entity : BaseEntity; 

我可以把它像Service.Get<LanguageModel, Language>(),它会从表语言从我的数据库返回的每一行,并自动将其转换为LanguageModels,我将在随后在我看来显示。

我想创建围绕Get()方法,你只需要在一个整数传递的包装方法,它会自动调用我在实体和模型类的类型Get()方法填充。唯一的问题是我很难在这背后的实际实现中包装我的头。

的伪代码将是沿着线:

  1. 呼叫WrapperGet((int)ReferenceType.Genre)
  2. 包装方法解决实体类型(Genre)和模型类型(GenreModel
  3. 调用Get()方法与解决的实体和模型类型,所以它会Get<GenreModel, Genre>()
  4. 返回结果

我将如何真正在C#中实现这一点?

+0

所以基本上你想有一个通用的存储库之后改变它解决此... ORM,你使用的是什么,是实体框架? – McGarnagle 2012-07-05 21:03:57

+0

是的。我们使用EF 4.0 – 2012-07-05 21:04:24

+0

如果我对你有所了解,对于AutoMapper来说,这看起来很不错,它是一个基于规则的引擎,用于将一个类转换为另一个类。 – neontapir 2012-07-05 22:04:02

回答

1

如果你想强类型的结果,你必须放弃传递一个int的想法或枚举的,并切换到直接调用Get或作出这样的方法:

List<LanguageModel> GetLanguages() { return Get<LanguageModel, Language>(); } 

如果弱类型的工作适合你,那我会用赛义德的解决方案去,但类型需要一点点的变化工作。 Model在你的例子中是一个泛型类型,所以推测他的意思是List<BaseModel>作为返回类型。但List<LanguageModel>不是List<BaseModel>!您可以通过使其返回IEnumerable<BaseModel>或改变Get返回一个List<BaseModel>,或return new List<BaseModel>(Get<...

2

我想不出一个完整的通用的方式,我认为最简单的方法是如下:

List<Model> WrapperGet(int type) 
{ 
    switch (type) 
    { 
     case 1: return Get<LanguageModel, Language>(); 
     .... 
    } 
    return null; 
}