7

プロパティを持つクラスがありますIEnumerable<T>List<T>new を作成してそのプロパティを割り当てるジェネリック メソッドを作成するにはどうすればよいですか?

IList list = property.PropertyType.GetGenericTypeDefinition()
    .MakeGenericType(property.PropertyType.GetGenericArguments())
    .GetConstructor(Type.EmptyTypes);

Tタイプがどこにあるのかわかりません

4

2 に答える 2

20

プロパティ名がわかっていると仮定すると、それが であることがわかっている場合IEnumerable<T>、この関数はそれを対応するタイプのリストに設定します。

public void AssignListProperty(Object obj, String propName)
{
  var prop = obj.GetType().GetProperty(propName);
  var listType = typeof(List<>);
  var genericArgs = prop.PropertyType.GetGenericArguments();
  var concreteType = listType.MakeGenericType(genericArgs);
  var newList = Activator.CreateInstance(concreteType);
  prop.SetValue(obj, newList);
}

このメソッドは型チェックやエラー処理を行わないことに注意してください。それはユーザーの演習として残します。

于 2013-02-15T04:26:31.187 に答える
2
using System;
using System.Collections.Generic;

namespace ConsoleApplication16
{
    class Program
    {
        static IEnumerable<int> Func()
        {
            yield return 1;
            yield return 2;
            yield return 3;
        }

        static List<int> MakeList()
        {
            return (List<int>)Activator.CreateInstance(typeof(List<int>), Func());
        }

        static void Main(string[] args)
        {
            foreach(int i in MakeList())
            {
                Console.WriteLine(i);
            }
        }
    }
}
于 2013-02-15T04:27:07.613 に答える