C# Generic foreach over IEnumerable 未知类型

C# Generic foreach over IEnumerable of unknown type

我正在尝试编写一个通用静态函数,它采用 IEnumerable class 的实例、属性 的名称和字符串分隔符。它将循环遍历实例,并对实例的每个成员求值 属性,将值 return 收集到由分隔符隔开的单个字符串中。

例如,如果我的集合 class 包含 Person 的实例并且 属性 名称是“Surname”,并且我的分隔符是“', '”,我可能 return :“史密斯”,'Kleine',“比彻姆”。然后我可能会用单引号将它括起来并将它用作 SQL.

中的列表

我的问题是我不知道如何遍历 IEnumerable。到目前为止我的代码:

public static string EnumerableItem2Str<T>(IEnumerable<T> oItems, string cPropertyName, string cSep)
{
    string cOP = "";
            
    try
    {
        foreach (<T> oItem in oItems)
        {
            cOP += CoreHelper.GetPropertyValue(oItems, cPropertyName).ToString();
            if (oItem != oItems.Last()) cOP += cSep;
        }
        return cOP;
    }
    catch (Exception ex)
    {
        return "";
    }
}

public static object GetPropertyValue(object o, string cPropertyName)
{
    return o.GetType().GetProperty(cPropertyName).GetValue(o, null);
}

我在行 foreach (<T> oItem in oItems) 上遇到错误,其中第一个是 <T> 上的“预期类型”。

如何遍历 oItems 以获取其中包含的每个实例?

你可以这样做:

static string GetCsv<T>(IEnumerable<T> items, string separator)
{
    return String.Join(separator, items.Select(x => x.ToString()).ToArray());
}

检查一下here

我想你想做这样的事情(它确实有一个空传播检查所以如果你使用的是旧版本的 C# 那么你需要删除 '.GetValue(i )'):

public static string EnumerableItem2Str<T>(IEnumerable<T> oItems, string cPropertyName, string cSep)
{
    var propertyValues = oItems
        .Select(i => i.GetType().GetProperty(cPropertyName)?.GetValue(i))
        .Where(v => v != null)
        .ToList();

    return string.Join(cSep, propertyValues);
}