2017-06-06 49 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; 
}