解析所有值的列表<T>

Ret*_*hic 0 c# generics parsing list

我有很多存储在列表中的类.我正在尝试创建一个接受List作为泛型类型的方法,并将相应列表中的每个元素的内容作为字符串返回.

这是许多课程中的一个的样本.这将被定义为List <Player>:

public class Player
{
    public int PlayerId { get; set; }
    public string PlayerName { get; set; }
    public string FavoriteThing { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我仍然在努力让语法正确:

  public static string GetStringOfData<T>(List<T> data)
    {
        string dataString = string.Empty;
        var type = data.GetType();

        // Insert magic here to get values for PlayerId, PlayerName, etc...

        return dataString;
    }
Run Code Online (Sandbox Code Playgroud)

我们怎样才能实现这一目标?我正在使用C#4.0.

更新 我正在使用的类是从edmx模型生成的,连接到数据库.这是一个报告工具,它将解析各种表并通过电子邮件向用户报告错误.用户特别要求能够查看所有字段的内容.

Oli*_*bes 5

每种类型都继承了该ToString方法object.覆盖ToString你的课程.

public class Player
{
    ...

    public override string ToString()
    {
        return String.Format("Player [ID = {0}, Name = {1}]",
                             PlayerId, PlayerName);
    }

{ 
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用非泛型IEnumerable来处理它们.(为什么要限制自己List<T>,如果你能有免费的午餐IEnumerable?后者将一起工作List<T>,数组SortedLists<T>,HashSet<T>,IEnumerbale<T>,的算法实现IEnumerable基于集合都没有,...)

public static string GetStringOfData(IEnumerable data)
{
    var sb = new StringBuilder();

    foreach (object o in data) {
        sb.Append(o).Append("; ");
    }    
    if (sb.Length >= 2 ) {
        sb.Length -= 2;
    }    
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这适用于几乎任何类型的集合.


注意:覆盖ToString具有正面的副作用,调试器将向您显示此字符串,而不是仅显示类型名称.