类型“;对象{System.Collections.Generic.List<;T>;}";VS”;Sy
本文关键字:gt VS Sy lt quot List 对象 System Generic Collections 类型 | 更新日期: 2023-09-27 18:00:08
我正在使用反射来获取List,并试图将其传递给接收List的委托。
然而,当我使用反射时,我的列表类型是:
object {System.Collections.Generic.List<T>}
当我把它传递给(泛型的)委托时,我会得到一个异常,因为它需要类型:
System.Collections.Generic.List<T>
为了确认这确实是个问题,我直接选了List<RealTClass>
,结果成功了。但是,在我的代码中,我不想进行这种不必要的强制转换。。。也因为我在使用泛型。
问题#1:为什么反射将对象返回为类型:object { X }
?
问题2:如何从类型中"删除"object { X }
部分?基本上,我需要一个解决这个问题的办法。。。。
谢谢。
更新#1:一些代码。。。
//METHOD receives 'obj' and 'includes'
T obj
Expression<Func<T, object[]>> includes = null
...
if (res && includes != null)
{
var array = includes.Body as NewArrayExpression;
if (array != null)
{
var exps = ((IEnumerable<object>)array.Expressions).ToArray();
for (var i = 0; i < exps.Length; i++)
{
var tartetListProperty = (exps[i] as MemberExpression).Member as PropertyInfo;
var navigationPropertyForList = tartetListProperty.GetCustomAttributes(typeof(NavigationPropertyForList)) as NavigationPropertyForList[];
if (navigationPropertyForList == null || navigationPropertyForList.Length == 0) continue;
var navigationPropertyForListString = navigationPropertyForList[0].TargetPropertyName;
if (tartetListProperty == null) continue;
var list = tartetListProperty.GetValue(obj); // WHERE I USE REFLECTION TO GET THE LIST
var listOfType = list.GetType().GetGenericArguments()[0];
var repDNI = uow.GetRepositoryDeleteNotIncludedAsyncByType(listOfType);
await repDNI(list, navigationPropertyForListString, obj.Id); // THIS IS WHERE IT FAILS
if (!res) break;
}
}
}
repDNI
对象是正确的,如果我进行了正确的强制转换,它就会工作,我遇到的唯一问题是获取list
,类型object { X }
围绕着我正确的类型。
我通过更改以下行使其工作:
之前:var list = tartetListProperty.GetValue(obj);
之后:dynamic list = tartetListProperty.GetValue(obj);
您可以转换为一个通用列表:
await repDNI((List<T>)list, navigationPropertyForListString, obj.Id);
据我所知,这应该可以解决您的问题,同时保留通用功能。