将列表中的所有子项作为集合(IList <t>集合已通过)

时间:2015-10-28 06:14:19

标签: c# linq generics

简而言之,我有一个IList<T>,我希望将列表的所有子属性作为集合,并能够查询每个子节点的属性,并且子节点的属性名称是一个字符串因此,为什么我有这个扩展课程来帮助我获得财产价值。

我可以使用list.SelectMany(),但是我不知道如何使用,因为我的属性的名称是一个字符串,并将其作为选择器投射是我不确定的一部分。

我已将问题问题添加到下面的代码中

public void Process<T>(IList<T> list)
{
    ........

    var childList = (from u in list from e in (u.GetPropertyValue("Images") as IEnumerable<object>) select e).ToList(); 

    //How do i bring back IList<T>, following line returns null

    var childList2 = (from u in list from e in (u.GetPropertyValue("Images") as IEnumerable<T>) select e).ToList(); //or as IList<T> will also return null

    BulkInsert(childList, "Images",  conn, tran);
}

private void BulkInsert<T>(IList<T> list, string tableName, SqlConnection conn, SqlTransaction tran)
{
    var props = TypeDescriptor.GetProperties(typeof(T))
                    .Cast<PropertyDescriptor>()
                    .ToArray();
   //(HERE LIES MY REAL ISSUE, as i am not getting list of properties for  each item in the list 
   //props  is BLANK (assuming because the type passed in is object and object has no "properties"), the same code works if I am passing List<Something> and it brings back all properties of Something
}

public static class PropertyExtension
{
    public static void SetPropertyValue(this object obj, string propName, object value)
    {
        obj.GetType().GetProperty(propName).SetValue(obj, value, null);
    }
    public static object GetPropertyValue(this object src, string propName)
    {
        return src.GetType().GetProperty(propName).GetValue(src, null);
    }
}

1 个答案:

答案 0 :(得分:0)

您正在处理运行时类型。所以忘掉泛型。泛型仅对编译时类型有用。

修复BulkInsert:

private void BulkInsert(Type type, string tableName, SqlConnection conn, SqlTransaction tran)
{
    var props = TypeDescriptor.GetProperties(type)
                    .Cast<PropertyDescriptor>()
                    .ToArray();
}

这样调用(假设你有一个相同类型的元素列表,忽略列表的类型):

if (childList.Count > 0)
{
  BulkInsert(childList[0].GetType(), "Images",  conn, tran);
}

如果您的T参数实际 有用:

  BulkInsert(typeof(T), "Images",  conn, tran);

其他所有内容,Linq的内容以及其他反思内容也可能会引发一些问题,但我会尽量将其缩短并专注于您的第一个问题。你应该尽量不要在一个问题上加入太多东西。