0

我使用反射动态获取数据(实体类型在运行时定义)。每当我的 currentObject 没有 1:N 关系(通过“First”泛型方法反射实现)时,我当前都会返回一个对象,但我还需要获取 1:N 子对象,即 EntityCollection<T>。

var valoresp = getFilho(pai, filho, raizAtual);
        if (valoresp == null)
            return new object();
 if (!filho.A_Ocorrencia_Tabela.Contains("1:N"))
        {
            var firstMethod = typeof(Enumerable).GetMethods().Single(method => method.Name == "First"
                              && method.IsStatic && method.GetParameters().Length == 1);
            var interfaceImplementation = MethodResolver.GetImplementationOfInterface(valoresp.GetType(),
                              firstMethod.GetParameters().First().ParameterType.GetGenericTypeDefinition());

            var genericArgumentsTypes = interfaceImplementation.GetGenericArguments();
            var genericMethod = firstMethod.MakeGenericMethod(new[] { genericArgumentsTypes[0] });
            try
            {
                var resultado = genericMethod.Invoke(null, new[] { valoresp });
                return resultado;
            }
            catch (Exception)
            {
                return new object();
            }

        }
        else
        {
            if (valoresp.GetType().IsGenericType && (valoresp.GetType().GetGenericTypeDefinition()  == typeof(EntityCollection<>))  )
            {
                   //here is the problem:
                   var typeValoresp = valoresp as EntityCollection<object>;


            }
        }

事实是我的“valoresp”变量可以是 480 种不同类型的 EntityCollection(这就是为什么我不会手动检查类型)(EntityCollection<table1>,EntityCollection<Table2> ...)

我需要一个子对象列表,但找不到使用反射将 EntityCollection 转换为 List 的方法。

4

1 回答 1

0

刚刚想出了如何:

与其尝试转换为 EntityCollection,不如先检查它是否是可枚举的(因为 EntityCollection 实现了 IEnumerable)并转换为 Enumerable。

然后您将能够使用 Linq 查询、方法等...并且避免强制转换为 List (但您仍然可以,因为 IEnumerable 具有 .ToList() 方法

if (valoresp is IEnumerable<object>)
{

    var valorEnum = valoresp as IEnumerable<object>;
    ...
    //valorEnum.First / valorEnum.where(...) etc..
}
于 2013-05-24T18:01:20.397 回答