类型“;对象{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 }围绕着我正确的类型。

类型“;对象{System.Collections.Generic.List<;T>;}";VS”;Sy

我通过更改以下行使其工作:

之前:var list = tartetListProperty.GetValue(obj);

之后:dynamic list = tartetListProperty.GetValue(obj);

您可以转换为一个通用列表:

await repDNI((List<T>)list, navigationPropertyForListString, obj.Id);

据我所知,这应该可以解决您的问题,同时保留通用功能。