C# 分析所有值的列表

C# 分析所有值的列表,c#,list,parsing,generics,C#,List,Parsing,Generics,我有许多类存储在列表中。我试图创建一个方法,该方法接受一个列表作为泛型类型,并将相应列表中每个元素的内容作为字符串返回 这是许多类中的一个示例。这将被定义为列表: 我仍在努力使语法正确: public static string GetStringOfData<T>(List<T> data) { string dataString = string.Empty; var type = data.GetType();

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

这是许多类中的一个示例。这将被定义为列表:

我仍在努力使语法正确:

  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;
    }
我们怎样才能做到这一点?我用的是C4.0

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

这里有几个选项

您可以让所有类实现一些接口,如

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来实现这一点,我认为这是您在问题中所追求的,但是您只是要连接所有公共字符串字段吗?这会稍微慢一点,而且更加难看,但确实有可能。您应该能够执行以下操作:

        foreach(T item in data)
        {
            var props = item.GetType().GetProperties();
            foreach(var prop in props)
            {   
                dataString += prop.GetValue(item, null);
            }
        }
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();
}
每个类型都从对象继承ToString方法。重写类中的ToString

公开课选手 { ... 公共重写字符串ToString { return String.FormatPlayer[ID={0},Name={1}], PlayerId,PlayerName; } } 然后可以使用非泛型IEnumerable来处理它们。如果你能和IEnumerable一起吃一顿免费午餐,为什么要把自己限制在清单上?后者将与列表、数组、分类列表、哈希集、IEnumerable一起使用,IEnumerable的算法实现完全不基于集合

公共静态字符串GetStringOfDataIEnumerable数据 { var sb=新的StringBuilder; 数据中的foreach对象{ 追加;追加; } 如果某人的长度>=2{ sb.长度-=2; } 使某人恢复原状; } 这适用于几乎任何类型的收藏


注意:重写ToString具有积极的副作用,即调试器将向您显示此字符串,而不仅仅是显示类型名称。

在每个类中,首先重写ToString方法:

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

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连接字符串。

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

其代码如下所示:

        foreach(T item in data)
        {
            var props = item.GetType().GetProperties();
            foreach(var prop in props)
            {   
                dataString += prop.GetValue(item, null);
            }
        }
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();
}

这与解析-序列化相反。Magic可以是任何序列化程序,例如JSON、XML或其他工具。最好的解决方案取决于您想要什么类型的输出,以及T的可能类型是什么。这是您自己的几个类,或者可能是任何类型。您将使用输出字符串做什么?调试?你能保存字符串吗?是否需要从字符串重新构建对象?它应该是可读的吗?这基本上就是我要建议的解决方案。多态条件的胜利!事实上,这不是一个好办法。很抱歉如果我的名字是Kobi,ID=3;?是的,我知道你可以摆脱束缚,但我可以继续。。。当然,这真的取决于OP的目的。例如,如果OP试图构建一个列表以进行快速调试,ToString就可以工作。我非常喜欢这种方法。为了简单起见,我没有提到我拥有的每个对象都是通过EDMX模型生成的。在应用此方法之前,我必须为每个表创建一个元数据类。@Kobi:为什么要转义字符串?那只是代表性的问题。例如,可以在引号中显示字符串。你有你想要的所有自由,在ToString中;这取决于OP想要什么。谢谢,这正是我需要的。取决于字符串列表的大小。使用StringBuilder而不是+=,可能会更好。