解析所有值</t>的列表<t>

时间:2012-11-01 14:34:42

标签: c# list parsing generics

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

这是许多课程之一的样本。这将被定义为List&lt; Player&gt;:

public class Player
{
    public int PlayerId { get; set; }
    public string PlayerName { get; set; }
    public string FavoriteThing { get; set; }
}

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

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

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

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

5 个答案:

答案 0 :(得分:5)

每种类型都会继承ToString中的object方法。在您的课程中覆盖ToString

public class Player
{
    ...

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

{ 

然后,您可以使用非通用IEnumerable来处理它们。 (如果您可以与List<T>享用免费午餐,为什么要限制自己为IEnumerable?后者适用于List<T>,数组,SortedLists<T>HashSet<T>,{ {1}} 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(); } 会产生积极的副作用,调试器会向您显示此字符串,而不是仅显示类型名称。

答案 1 :(得分:2)

您应该能够执行以下操作:

        foreach(T item in data)
        {
            var props = item.GetType().GetProperties();
            foreach(var prop in props)
            {   
                dataString += prop.GetValue(item, null);
            }
        }

答案 2 :(得分:1)

在这里结合选择。

您可以让所有类都实现某些界面,例如

IDataString

包括从对象获取字符串数据的方法。然后你的方法可以接受那些列表,并返回一个字符串:

public static string GetStringOfData(List<IDataString> data)
    {
        StringBuilder sb = new StringBuilder();
        foreach(var dm in data)
        {
          sb.append(dm.InterfaceMethod());
        }

        return sb.ToString()
    }

您还可以在所有对象中覆盖ToString,并只接受对象列表。代码类似。这假设您不介意丢失正常的ToString功能。

你可以用refelction做到这一点,我认为这就是你在问题中所追求的,但是你只是要连接所有的公共字符串字段?这有点慢,而且更难看,但可以肯定。

答案 3 :(得分:1)

首先在每个类中覆盖ToString()方法:

public class Player
{
    public int PlayerId { get; set; }
    public string PlayerName { get; set; }
    public string FavoriteThing { get; set; }
    public override string ToString()
    {
        return this.PlayerId.Tostring() + " " + PlayerName + " " + FavoriteThing;
    }
}

然后在你的方法中连接所有从类实例返回的字符串:

public static string GetStringOfData<T>(List<T> data)
        {
            StringBuilder dataBuilder = new StringBuilder();
            foreach (object o in data)
            {
                dataBuilder.Append(o.ToString());
                dataBuilder.Append(" ");
            }

            return dataBuilder.ToString();
        }

请注意,由于性能问题,最好使用StringBuilder连接字符串。

答案 4 :(得分:0)

您期望的魔力可能是反射:在运行时确定属性并获取列表中每个项目的值。

以下代码如下:

public static string GetStringOfData<T>(List<T> list)
{
    var stringBuilder = new StringBuilder();

    var properties = typeof(T).GetProperties()
        .Where(p => !p.GetIndexParameters().Any());

    foreach (var item in list)
    {
        foreach (var propertyInfo in properties)
        {
            stringBuilder.AppendFormat("{0}={1};",
                                        propertyInfo.Name,
                                        propertyInfo.GetValue(item, null));
        }
        stringBuilder.AppendLine();
    }

    return stringBuilder.ToString();
}