2013-02-15 56 views
5

我有一個類012財產IEnumerable<T>。如何創建一個新的List<T>的通用方法並分配該屬性?用反射創建通用列表<T>

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

我不知道哪裏是T類可以是任何

+3

不知道你的意思,你能不能只用'IEnumerable.ToList()' – 2013-02-15 04:09:05

+0

究竟什麼是你特林做,創建一個列表''形式的IEnumerable''? – 2013-02-15 04:26:01

+0

我需要用屬性的類型創建一個空列表 – rkmax 2013-02-15 04:36:30

回答

16

假設你知道屬性名,你知道它是一個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); 
} 

請注意此方法沒有類型檢查或錯誤處理。我將其作爲練習留給用戶。

+0

我完全忘記了Activator.CreateInstance,錯誤處理已完成;) – rkmax 2013-02-15 05:01:39

1
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); 
      } 
     } 
    } 
} 
+0

爲什麼不直接使用'Func()。ToList()' – 2013-02-15 04:28:18

+0

T是哪裏?是不是通用的。 – 2017-03-08 11:24:49