创建一个在C#中返回泛型类型列表的泛型函数

时间:2017-07-27 10:11:51

标签: c# generics reflection

我有两个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检索数据,存储它进入list类型泛型并返回callingmethod

3 个答案:

答案 0 :(得分:0)

您的CalledClass应接受T为通用。

您的人员和部门都应至少具有接口和接口(如果您需要对这些对象执行操作。)

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类型。

答案 1 :(得分:0)

看起来您可以从实体框架中受益。它具有您需要的方法,使用DbContextDbSet<T>和Linq-to-sql进行调用。

答案 2 :(得分:0)

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

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

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

巡视示例显示您的对象非常相似,因此我建议您提取一个通用界面:

  1. 删除前缀PersonDepartment此类信息已在课程
  2. 中提供
  3. 然后在界面中移动这些属性
  4. 这将为您留下以下层次结构

    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();
        }
    }