c# - 通用 C# 方法

标签 c# generics

我有两个类

public class JobDataProvider
{
   public List<Job> Get(int id){
       List<Job> jobs = new List<Job>();
       foreach(up_GetJobResult result in myDataContext.up_GetJob(id))
       {
          jobs.add(new Job(Id = result.Id, name = result.Name));
       }
     return jobs;
   }
}//end class Job

public class PersondataProvider{
    public List<Person> Get(int id){
      List<Person> persons = new List<Persons>();
      foreach(up_GetPersonsResult result in MyDataContext.up_GetPerson(id)){
          persons.add(new Person(Id = result.Id, Name = result.Name, Surname =     result.Surname));
          }
       return persons;
     }
}end class Person

我想创建一个通用方法,像这样

public List<T> Get<T>(int id)
{
   .. get data and return the list
}

最佳答案

您没有确切地提出问题,但我会看看是否能猜到您在问什么。您需要一个通用方法,您可以在其中指定要返回的类型和 ID,并让通用方法确定从哪里获取数据。

您可以创建一个字典,其中键是类型 (T),值是您想要返回的列表,或者可能是返回您想要的列表的接口(interface)实例(如果该列表是动态的并且您不这样做)不想将其存储在多个地方)。

这是一个您可以尝试的界面(显然您会想要添加更多错误处理)。当然,这个示例假设您不仅有一个显式接口(interface)(IDataProvider),还有一个隐式接口(interface)(IDataProvider.Get 必须返回一个正确类型的泛型列表)。

public interface IDataProvider
{
  IEnumerable Get(int id);
}

public class JobDataProvider
  : IDataProvider
{

  public List<Job> Get(int id)
  {
    var jobs = new List<Job>();
    // load jobs
    return jobs;
  }

  IEnumerable IDataProvider.Get(int id)
  {
    return Get(id);
  }
}

public class PersonDataProvider
  : IDataProvider
{

  public List<Person> Get(int id)
  {
    var people = new List<Person>();
    // load people
    return people;
  }

  IEnumerable IDataProvider.Get(int id)
  {
    return Get(id);
  }
}

public class ItemDataProvider
{
  private Dictionary<Type, IDataProvider> mProviders = new Dictionary<Type, IDataProvider>();
  public void RegisterProvider(Type type, IDataProvider provider)
  {
    mProviders.Add(type, provider);
  }

  public List<T> Get<T>(int id)
  {
    var data = mProviders[typeof(T)].Get(id);
    return (List<T>)data;
  }
}

public class Job
{
}

public class Person
{
}

关于c# - 通用 C# 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2338064/

相关文章:

c# - 如何使用C#模拟Windows简单 "Button"的点击功能

C# 如何在我的 Windows 窗体应用程序中的字符串内部进行一些基本数学运算

java - 泛型下界 ('super' ) 问题?

generics - 指定泛型参数属于一小组类型

c# - 为什么我的应用程序在注销/关闭时没有关闭(c#/.net winforms)?

c# - 泛型 Func<T> 的运行时创建

c# - 插入MongoDB时如何防止_t和_v?

swift - 从 'text' 快速调用一个函数

generics - 在这种情况下我可以使用 swift Generic

Java 泛型方法 - 无法使用泛型参数实例化类