2013-02-15 14 views
5

के साथ बनाएं मेरे पास IEnumerable<T> संपत्ति वाला एक वर्ग है। मैं एक सामान्य विधि कैसे बना सकता हूं जो एक नया List<T> बनाता है और उस संपत्ति को असाइन करता है?जेनेरिक सूची <T> प्रतिबिंब

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

मैं नहीं जानता जहां टी प्रकार कुछ भी

+3

यकीन है कि तुम क्या मतलब है, तो आप सिर्फ उपयोग नहीं कर सकते नहीं 'IEnumerable.ToList()' –

+0

वास्तव में आप क्या करना tring हैं, एक 'सूची ' 'प्रपत्र IEnumerable ' बनाने ?? –

+0

मुझे संपत्ति के प्रकार – rkmax

उत्तर

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

मैं पूरी तरह से एक्टिवेटर भूल गया था। क्रेट इंस्टेंस, त्रुटि प्रबंधन किया जाता है;) – rkmax

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() ' –

+0

का उपयोग क्यों करें टी? सामान्य नहीं है। –

संबंधित मुद्दे