创建<T>的通用列表

问题描述

我想创建一个将创建通用对象列表的方法。可能吗?像这样:

public class Mtrl 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }        
    public string Aa { get; set; }
}

public class Trdr 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Address { get; set; }
    public string AFM { get; set; }
    public string Phone01 { get; set; }
    public string Aa { get; set; }
}

然后使用通用类创建我的列表:

public class Genericclass<T>
{        
    public List<T> GetData<T>()
    {
        List<T> myList = new List<T>();
        if (typeof(T) == typeof(Trdr))
        {
            myList.Add(new Trdr());//Error 1: cannot convert from Trdr to 'T'   
        }
        if (typeof(T) == typeof(Mtrl))//Error 2: cannot convert from Mtrl to 'T'    
        {
            myList.Add(new Mtrl());
        }
        return myList;
    }
}

我的错误。我将尝试澄清更多。 Trdr,Mtrl等类将具有许多不同的属性。 Getdata方法将通过json从Web服务获取数据,我想创建一个对象列表并返回它 像这样:

public List<T> GetData<T>()
        {
            List<T> myList = new List<T>();
            if (typeof(T) == typeof(Trdr))
            {
                for (int i = 0; i < 100; i++)//fetch data from web api in json format
                {
                    Trdr NewObj = new Trdr();
                    NewObj.Aa = "...";
                    NewObj.AFM = "...";

                    myList.Add(NewObj);
                }
            }
            if (typeof(T) == typeof(Mtrl))
            {
                for (int i = 0; i < 100; i++)
                {
                    Mtrl NewObj = new Mtrl();
                    NewObj.Aa = "...";
                    NewObj.Name = "name ...";

                    myList.Add(NewObj);
                }
            }
            return myList;
        }
    }

解决方法

我建议提取一个接口(甚至是一个基类):

 //TODO: Since you have more than 2 classes,please check the common interface 
 public interface Idr {
   string Id   { get; set; }
   string Name { get; set; }
   string Code { get; set; }        
   string Aa   { get; set; }
 }

所有感兴趣的类别都可以实现:

public class Mtrl : Idr
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }        
    public string Aa { get; set; }
}

public class Trdr : Idr 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Aa { get; set; }

    public string Address { get; set; }
    public string AFM { get; set; }
    public string Phone01 { get; set; }
}

现在您可以使用List<Idr>集合;我们希望实现T的类(Idr)也具有无参数构造函数(new()):

public class GenericClass<T> where T : Idr,new()
{        
    public List<T> GetData()
    {
        List<T> myList = new List<T>() {
          new T();
        };

        return myList;
    }
}
,

听起来像您正在尝试创建一个包含一些初始数据的新列表,并且您需要对许多不同的类型T执行此操作。

如果MtrlTrdr没有什么共同之处,并且处理方式完全不同,请考虑简单地使用不同的方法来获取每种类型的列表:

GetDataMtrl(){
    var result = new List<Mtrl>();
    result.Add(new Mtrl());
    return result;
} // etc

否则,您需要的是Type Constraints of Generic Parameters,它可以告诉编译器更多有关T是什么的信息。更确切地说,T的不同值必须具有共同点。例如,您可以

    public List<T> GetData<T>() where T : new()
    {
        List<T> myList = new List<T>();

        myList.Add(new T());

        return myList;
    }

要说,对于T,必须做new T()。然后,您可以说GetData<Trdr>()来获得一个列表,其中包含一个空的Trdr,因为您的代码似乎可以尝试这样做。

也许您需要在数据中设置一些默认值。我注意到这些类有很多共同的变量。然后,您可以考虑使用继承来指定这种共性:

public class Mtrl 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }        
    public string Aa { get; set; }
}

public class Trdr : Mtrl
{
    public string Address { get; set; }
    public string AFM { get; set; }
    public string Phone01 { get; set; }
}

然后编写通用代码,其中TMtrl类型或其后代类:

    public List<T> GetData<T>() where T : Mtrl
    {
        List<T> myList = new List<T>();
        T MtrlOrTrdr = new T();
        MtrlOrTrdr.Id = "my-new-id-";

        myList.Add(MtrlOrTrdr);

        return myList;
    }