2017-06-06 79 views
0

請參閱下面的兩個類:的T返回列表頁,其中T是X班(其中x是大於零)

public class Person 
    { 
     int ID; 
     string Name; 
     string Address; 
    } 

    public class PersonModel 
    { 
     int ID; 
     string Name; 
     string Address; 
    } 

我想創建一個將返回PersonModel列表的功能或者根據傳遞給全班參數人的名單:

下面是客戶端功能:

public static List<T> BuildList<T>() 
     { 
      //Populate list of T where T is wither a Person or PersonModel. 
      //Return List of T 
     } 

可以這樣做?

+1

爲什麼你需要兩個相同的類名稱不同? –

+1

如果沒有關於如何實際填充這些列表的信息,問題並不十分清楚 – Evk

+1

「可以這樣做嗎?」 - 是的你可以。建議的功能沒問題。但問題是 - 這是你真正需要的嗎? – pkuderov

回答

1

要回答這個問題已經被問到的條件。是的,這是可能的,你幾乎自己給出了答案。您只需要使用模板類型在您的函數中初始化您的列表,然後按照需要的方式填充它。

public static List<T> BuildList<T>() where T : new() 
{ 
    List<T> ownList = new List<T>(); 

    // Populate your list the way you want. 

    return ownList; 
} 

來填充您的列表中,您可以創建默認類OBJETS並將它們添加到您的列表,像這樣:

T myObject = new T(); 
ownList.Add(myObject); 

或者,如果你要填寫取決於特定的方式列表T的類型,可以使用typeof

if(typeof(T) == typeof(Person)) 
{ 
    // Initialize your Person objets in a specific way. 
} 

但我會盡量避免前往該選項。我要麼爲你的每一個類的特定聲明你的函數,要麼使用一個接口來重新組合每個類的元素,讓這些類實現這個接口,並通過你的接口初始化你的對象。 Evk的回答就是這種實施的一個很好的例子。

+1

如果您想要執行'T myObject = new T();'您需要對方法 – Jamiec

+0

@Jamiec Youps有一個'new()'約束,這是一個很好的調用。糾正。 – Isuka

1

您能介紹這將共享這兩個類的公共屬性的接口,那麼你的T參數限制到該接口:

public interface IPerson { 
    int ID { get; set; } 
    string Name { get; set; } 
    string Address { get; set; } 
} 

public class Person : IPerson { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

public class PersonModel : IPerson { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

public static List<T> BuildList<T>() where T : IPerson, new() { 
    var result = new List<T>(); 
    for (int i = 0; i < 10; i++) { 
     result.Add(new T() { 
      ID = i, 
      Address = "address" + i 
     }); 
    } 
    return result; 
} 
+0

aaaaaaaand然後你甚至有3個相同的實體;)不怪你的答案。只是要指出,這個問題有點腥味 – pkuderov

-1

使用的界面和實現,在這兩個類,然後使用該接口的通用方法

class Program 
{ 
    static void Main(string[] args) 
    { 

    } 

    public static List<T> BuildList<T>() where T : IPersonModel, new() 
    { 
     //Populate list of T where T is wither a Person or PersonModel. 
     //Return List of T 
     // Implement here with any loop 
     return null;// you need to return any value 
    } 
} 


public interface IPersonModel 
{ 
    int ID { get; set; } 
    string Name { get; set; } 
    string Address { get; set; } 
} 
public class Person : IPersonModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

public class PersonModel : IPersonModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 
0

在你的具體情況下,我會說你的問題有異味,我的意思是你看起來只是在錯誤的方向。

所以我同意@Jamiec評論:

如果你有單獨的類單獨的目的(模型,數據庫VS實體),那麼它不清楚爲什麼你需要一個通用的方法,以「建立一個列表」。


要回答標題中的問題,這裏的代碼(但是這樣做的方式是隻是奇怪):

public interface IPerson 
{ 
    public int Id {get;} 
    public string Name {get;} 
} 

public GoodPerson : IPerson 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public int GoodDeedCount {get; set;} 


    void SayGoodDay(IPerson toPerson) 
    { 
     GoodDeedCount++; 
     return $"Good day, {toPerson.Name}! :)" 
    } 
} 

public BadPerson : IPerson 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public int Badness {get; set;} 

    void SayShutUp(IPerson toPerson) 
    { 
     Badness++; 
     return $"Shut up, {toPerson.Name}!" 
    } 
} 

public UglyPerson : IPerson 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 

    void SayNothing() { } 
} 

public static List<T> BuildList<T>() 
    where T: new() 
{ 
    var result = new List<T>(); 
    if (T is GoodPeson) 
    { 
     result.Add(new GoodPerson{Id = 1, Name = "Pinky", GoodDeedCount = 0}); 
     result.Add(new GoodPerson{Id = 2, Name = "Brain", GoodDeedCount = 0}); 
    } 
    else if (T is BadPerson) 
    { 
     result.Add(new BadPerson{Id = 1, Name = "Sunshine", Badness = 0}); 
    } 
    else if (T is UglyPerson) 
    { 
     result.Add(new UglyPerson{Id = 1, Name = "No", Badness = 0}); 
    } 
    return result; 
} 
相關問題