简而言之,我有一个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);
}
}
答案 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的内容以及其他反思内容也可能会引发一些问题,但我会尽量将其缩短并专注于您的第一个问题。你应该尽量不要在一个问题上加入太多东西。