簡體   English   中英

創建一個通用列表<t></t>

[英]Create a Generic list of <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; }
}

然后使用通用 class 創建我的列表:

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

我建議提取一個接口(甚至是一個基本的 class ):

 //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>集合; 我們希望實現 Idr 的Idr ( T ) 也具有無參數構造函數 ( 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

否則,您需要的是通用參數的類型約束,它可以告訴編譯器更多關於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的列表,就像您的代碼似乎嘗試做的那樣。

也許您需要在數據中設置一些默認值。 我注意到這些類有很多共同的變量。 那么你可以考慮使用 inheritance 來指定這個共性:

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類型或其后代 class:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM