返回基于int值的类类型

时间:2012-07-05 21:00:55

标签: c# generics

现在,我有一个这样的枚举:

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

Language,Period和Genre都是映射回数据库中表的实体类。我还有模型类,它们用实体类映射几乎1到1,然后我在视图中显示它。

我也有这样的服务方法:

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

我可以像Service.Get<LanguageModel, Language>()一样调用它,它将从我的数据库中返回表格语言的每一行,并自动将它们转换为语言模型,然后我将在我的视图中显示。

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

伪代码将遵循:

  1. 致电WrapperGet((int)ReferenceType.Genre)
  2. Wrapper方法解析实体类型(Genre)和模型类型(GenreModel
  3. 使用已解析的实体和模型类型调用Get()方法,因此它为Get<GenreModel, Genre>()
  4. 返回结果
  5. 我如何在C#中实现这一点?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果你想要强类型的结果,你将不得不放弃传递int或枚举的想法,并切换到直接调用Get或制作这样的方法:

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

如果弱类型适合你,那么我会选择Saeed的解决方案,但类型需要稍微改变才能工作。 Model在您的示例中是通用类型,因此可能他将List<BaseModel>视为返回类型。但是List<LanguageModel>不是List<BaseModel>!您可以通过返回IEnumerable<BaseModel>或更改Get以返回List<BaseModel>来解决这个问题,或者之后使用return new List<BaseModel>(Get<...

更改它