0

IEnumerable<Person>たとえば、私は持っています。

List<Person>実行時に作成できるようにしたい

以下のコードがありますが、システムランタイムタイプを変換できないというエラーが表示されます

足りないものはありますか?

private static readonly MethodInfo enumerableToListMethod = typeof(Enumerable).GetMethod("ToList", BindingFlags.Public | BindingFlags.Static);

//genericType will be Person
var genericType = modelType.GetGenericArguments().First();

var genericToListMethod = enumerableToListMethod.MakeGenericMethod(new[] { genericType });

//modelType is IEnumerable<Person>
var ienumtype = genericToListMethod.Invoke(null, new object[] { modelType });

Activator.CreateInstance(ienumtype.GetType());
4

1 に答える 1

2

列挙可能なタイプではなく、IEnumerableをinvokeに渡す必要があります。また、invokeを呼び出すと、タイプではなくリストが返されます。

コードを入れる:

var instance = < the IEnumerable >;
var modelType = instance.GetType();

//modelType is IEnumerable<Person>
var enumerableAsList = genericToListMethod.Invoke(null, new object[] { instance});

あなたのコメントに基づいて、私はあなたがこのような何かを求めていると推測しています:

Func<IEnumerable<T>, List<T>> MakeMeAToListerForEnumerablesOfType<T>()
{
    var itemType = typeof(T);
    var enumerableToListMethod = typeof(Enumerable).GetMethod("ToList", BindingFlags.Public | BindingFlags.Static);
    var genericToListMethod = enumerableToListMethod.MakeGenericMethod(new[] { itemType });
    return (Func<IEnumerable<T>, List<T>>)Delegate.CreateDelegate(typeof(Func<IEnumerable<T>, List<T>>), genericToListMethod);
}

あなたはどちらを好きだと思いますか:

IEnumerable<string> enumerable = new string[] { "a", "b", "c" };
var toLister = MakeMeAToListerForEnumerablesOfType<string>();

Derp。電話に出られなかった...

var enumerableAsList = toLister(enumerable);
于 2012-12-31T21:14:44.883 に答える