【问题标题】:Create a generic function that return a generic type list in C#在 C# 中创建一个返回泛型类型列表的泛型函数
【发布时间】:2017-07-31 15:37:08
【问题描述】:

我有两个Model 类,一个是Person,另一个是Department。我想要实现的是我想创建一个通用函数,该函数可用于以List 的形式检索通用类型数据,例如一个电话将返回Person List,另一个电话将返回Department List。更具体地说,我想以 List 的形式返回数据。

下面是Person 类。

public class Person {

    public Int16 Personid{ get; set; }
    public string Personname { get; set; }
    public string Personaddress { get; set; }

}

下面是Department 类。

public class Department {

     public Int16 Departmentid { get; set; }
     public string Departmentname { get; set; }
     public string Departmentsection { get; set; }

}

以下是调用函数,其中一次我使用CallingMethodPerson() 拨打电话,另一次拨打CallingMethodDepartment()

public class CallingClass {

   public void CallingMethodPerson() {

      CalledClass calling = new CalledClass();
      Calling. CalledMethod();

   }

    public void CallingMethodDepartment() {

      CalledClass calling = new CalledClass();
      Calling. CalledMethod();

    }
}

下面的蓝图是CalledClass,它在其中进行一些操作并返回PersonDepartment 的列表。

public class CalledClass {

    public void CalledMethod() {
      //this is a generic method wherein returns the list of either a Person 
      or Department whenever called.

    }
}

总而言之,我想实现一个返回泛型类型数据的通用函数。诀窍实际上是我想构建一个具有SQL Read command 的通用函数,因此我将使用不同的模型一次又一次地调用相同的函数,执行查询,从database 检索数据,将其存储到@987654340泛型类型的@ 并返回到callingmethod

【问题讨论】:

  • 所以...public List<T> CalledMethod<T>()...有什么问题?
  • @ZoharPeled 我希望CalledMethod() 识别调用的类型是Person 还是Department,然后运行SQL Read 命令,将其存储在泛型类型列表中并返回结果.我知道你现在会说 SQL 是从哪里出现的。我的目标是我正在尝试构建一个通用函数来处理命令并在列表中返回结果。

标签: c# generics reflection


【解决方案1】:

你的 CalledClass 应该接受 T 作为泛型。

你的 Person 和 Department 至少应该有共同的接口(如果你需要对这些对象做一些事情的话。)

public class CalledClass<T> where T : IAmAClassObject {

    public List<T> CalledMethod() {
         //create your objects and do something
         return objects.ToList();
    }
}

另一种处理方法是让 CalledMethod 处理泛型 公共类 CalledClass {

    public List<T> CalledMethod<T>() {
         //create your objects and do something
         return objects.ToList();
    }
}

这样你应该在 CallingClass 类中实例化 CalledClass 一次,然后调用 CallMethod 并给出正确的 T 类型。

【讨论】:

    【解决方案2】:

    看起来您可以从实体框架中受益。它有你需要的方法,使用DbContextDbSet&lt;T&gt;和Linq-to-sql调用。

    【讨论】:

      【解决方案3】:

      执行此操作的正确语法如下:

      public class CalledClass<T>
      {
          public List<T> CalledMethod()
          {
               return objects.ToList();
          }
      }
      

      但这将不允许您修改列表条目,因为有object 类型。

      Tour example 显示您的对象非常相似,所以我建议提取一个通用接口:

      1. 去掉前缀PersonDepartment这个信息已经在类中给出了
      2. 然后在界面中移动这些属性

      这将为您留下以下层次结构

      public interface IEntity
      {
          string Name {set;get;}
          string Id {set;get;}
      }
      
      public class Person : IEntity 
      {   
          string Name {set;get;}
          string Id {set;get;}
          string Address {set;get;}
      }
      
      public class Department : IEntity 
      {   
          string Name {set;get;}
          string Id {set;get;}
          string Section {set;get;}
      }
      

      您现在可以添加一个约束,即您的泛型函数只接受 IEntity 的子级

      public class CalledClass<TEntity>
          where TEntity : IEntity
      {
          public List<TEntity> CalledMethod()
          {
               // You can access Name and Id here
               foreach(var entity in entities) // i know the code is not useful ;) 
                   entity.Id = "Unique ID";    // only for demonstration purposes
                   entity.Name = "Random Name";
               }
      
               return entities.ToList();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多