0

リフレクションを使用して動的にデータを取得します (エンティティ タイプは実行時に定義されます)。現在、currentObject に 1:N の関係がない場合は常に単一のオブジェクトを返していますが (「最初の」ジェネリック メソッド リフレクションの実装を介して)、EntityCollection< T > である 1:N の子も取得する必要があります。

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 をリストに変換する方法が見つかりませんでした。

4

1 に答える 1

0

次の方法を見つけました。

EntityCollection にキャストしようとする代わりに、最初にそれが列挙可能かどうかを確認し (EntityCollection は IEnumerable を実装しているため)、Enumerable にキャストします。

次に、Linqクエリ、メソッドなどを使用できるようになります...さらに、リストへのキャストを回避します(ただし、IEnumerableには .ToList() Method があるため、それでも可能です

if (valoresp is IEnumerable<object>)
{

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