2012-08-15 11 views
6

पर मैं एक डी कंटेनर बनाने की कोशिश कर रहा हूं और मैं निम्न समस्या पर ठोकर खा रहा हूं: मेरे पास एक तरीका है जो किसी दिए गए प्रकार के लिए पंजीकृत उदाहरणों की एक सूची पुनर्प्राप्त करता है और मैं चाहता हूं किसी दिए गए ऑब्जेक्ट में IEnumerable<T> गुणों को इंजेक्ट करने के लिए इसका उपयोग करें।कास्टिंग सूची <object><T> पर रनटाइम

class A { public IList<IExample> Objects { get; set; } } 
class B: IExample {} 
class C: IExample {} 
Container.Register<IExample>(new B()); 
Container.Register<IExample>(new C()); 
var obj = new A(); 
Container.Inject(A); 
Debug.Assert(A.Objects != null && A.Objects.Count == 2); 

मेरे Retrieve विधि देता है एक IList<object>, मुख्य रूप से, क्योंकि मैं उस पल में कोई प्रकार की जानकारी है, तो मैं एक List<T> में उस सूची को परिवर्तित करने का प्रयास कर रहा हूँ: मैं क्या हासिल करने की कोशिश कर रहा हूँ का एक उदाहरण निम्नलिखित होगा इंजेक्शन समय पर। यहाँ काम कर रही विधियों में से एक लधु रूप है:

public virtual IList<object> Retrieve(Type type) 
{ 
    var instances = Registry[type]; 
    foreach(var instance in instances) 
     Inject(type, instance); // omitted 
    return instances; 
} 

public virtual void Inject<T>(T instance) 
{ 
    var properties = typeof (T).GetProperties(); 
    foreach (var propertyInfo in properties) 
    { 
     var propertyType = propertyInfo.PropertyType; 
     if (!IsIEnumerable(propertyType)) continue; 
     var genericType = propertyType.GetGenericArguments()[0]; 
     propertyInfo.SetValue(instance, 
      GetListType(genericType, Retrieve(genericType)), null); 
    } 
} 

protected virtual object GetListType(Type type, IEnumerable<object> items) 
{ 
    return items.Select(item => Convert.ChangeType(item, type)).ToList(); 
} 

कोड त्रुटि देता है: System.InvalidCastException : Object must implement IConvertible. दुख की बात है, मैं कैसे यहां से आगे बढ़ने के लिए पता नहीं है। शायद मैं यह सब गलत कर रहा हूँ। मैंने जेनेरिक का उपयोग करने या हाथ से कई गुणों को इंजेक्शन देने का विचार किया है, लेकिन मुझे वास्तव में ऐसा नहीं करना पड़ेगा।

किसी भी मदद या विचारों के लिए अग्रिम धन्यवाद। ,

public virtual IList Retrieve(Type type) 
{ 
    // ... 
    listType = typeof(List<>).MakeGenericType(new Type[] { type }); 
    IList list = (IList)Activator.CreateInstance(listType); 
    // ... 
    return list 
} 

इस सूची IList<T> लिए casted जा सकता क्योंकि यह एक है:

उत्तर

6

आप इस तरह एक सामान्य सूची बना सकते हैं।

आप IEnumerable और Cast<T> का उपयोग करने पर विचार कर सकते हैं, लेकिन तब आपके पास सूची का एक उदाहरण नहीं है। मैं नहीं जानता कि यह कितना महत्वपूर्ण है।

+0

यह कुछ नया है। मुझे नहीं पता था कि आप एक सामान्य प्रकार को सीधे बना सकते हैं। मैं अभी कोशिश करूँगा। –

+0

धन्यवाद, यह पूरी तरह से काम किया! –