如何创建泛型类型实例并使用属性方法

时间:2017-08-07 17:18:56

标签: c# generics

假设我有两个班级:学生和老师。 我想创建一个泛型方法,它将返回两个类之一的列表,基于作为参数传递的类型。

class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string BloodGroup { get; set; }
    public string Address { get; set; } 
}

class Teacher
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string BloodGroup { get; set; }
    public string Address { get; set; }
}

class GenericClassTest
{
    public List<T> getInformation<T>(List<T> infos )
    {
        var infoList = new List<T>(); // It's not working
        foreach (T item in infos)
        {
            T info = new T();
            info.Id = item.Id;
            info.Name = item.Name;
            info.BloodGroup = item.BloodGroup;
            info.Address = item.Address;
            infoList.Add(info);
        }
        return infoList;
    }
}

如何实例化应该代表Student和Teacher类的 T 。我希望能够进行以下调用:

getInformation<Student>(studentList);
getInformation<Teacher>(teacherList);

2 个答案:

答案 0 :(得分:3)

我会添加一个学生和教师都继承自的父类。然后,您可以将方法的泛型参数限制为该父类型。您可能还需要在getInformation()方法中完成更多工作,但这应该可以帮到您:

class Person
{   
    public Person()
    {

    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string BloodGroup { get; set; }
    public string Address { get; set; }
}

class Student : Person
{
    //unique Student properties go here
}
class Teacher : Person
{
    //unique teacher properties go here
}

class GenericClassTest
{
    public List<T> getInformation<T>(List<T> infos )
        where T : Person, new()
    {
        var infoList = new List<T>(); // It's not working
        foreach (T item in infos)
        {
            T info = new T();
            info.Id = item.Id;
            info.Name = item.Name;
            info.BloodGroup = item.BloodGroup;
            info.Address = item.Address;
            infoList.Add(info);
        }
        return infoList;
    }
}

答案 1 :(得分:1)

我相信你正在寻找interface。通过接口,您可以访问相同类的方法和属性,而无需知道它是哪一个。

public interface ICantThinkOfAGoodName
{
public int Id { get; set; }
public string Name { get; set; }
public string BloodGroup { get; set; }
public string Address { get; set; } 
}

然后您可以这样调用您的方法:

getInformation<ICantThinkOfAGoodName>(studentList);

但是,我建议删除您创建的泛型类,而只是使用List。您可以查看对象,并在不知道对象是学生还是教师的情况下进行编辑。