3

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

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>(),它会从我的数据库中返回表 Language 的每一行,并自动将它们转换为 LanguageModel,然后我将在我的视图中显示。

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

伪代码将类似于:

  1. 称呼WrapperGet((int)ReferenceType.Genre)
  2. Wrapper 方法解析实体类型 ( Genre) 和模型类型 ( GenreModel)
  3. 使用已解析的实体和模型类型调用该Get()方法,这样就可以了Get<GenreModel, Genre>()
  4. 返回结果

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

4

2 回答 2

2

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

List<Model> WrapperGet(int type)
{
   switch (type)
   {
      case 1: return Get<LanguageModel, Language>();
      ....
   }
   return null;
}
于 2012-07-05T21:08:52.000 回答
1

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

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

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

于 2012-07-05T21:58:30.310 回答