2009-12-16 29 views
8

नीचे दिए गए फ़ंक्शन को एक ऑब्जेक्ट स्वीकार करता है, जो कभी-कभी किसी दिए गए प्रकार की सरणी हो सकता है। इस मामले में, मुझे लगता है कि प्रकार obj [0] .GetType() के साथ निर्धारित किया जा सकता है, मानते हैं कि सरणी में कम से कम एक सदस्य है। मैं इस तरह के एक सरणी को एक सामान्य सूची < टी > उचित प्रकार के रूप में परिवर्तित करना चाहता हूं, लेकिन नीचे दिया गया कोड केवल सूची < ऑब्जेक्ट > में कनवर्ट करने में सफल होता है। यह कैसे किया जा सकता है?किसी भी प्रकार की सूची को <T> (सी #)

 
     public object GetDeserializedObject(object obj, Type targetType) 
     { 
      if (obj is Array) 
      { 
       List<object> obj2 = new List<object>(); 
       for (int i = 0; i < ((Array)obj).Length; i++) 
       { 
        obj2.Add(((object[])obj)[i]); 
       } 
       obj = obj2; 
      } 
      return obj; 
     } 

ध्यान दें कि GetSerializedObject() एक समारोह IDataContractSurrogate इंटरफ़ेस से संबंधित लागू करता है, तो मुझे नहीं लगता कि दिखाया गया के रूप में मैं अपने हस्ताक्षर को बदल सकते हैं है।

उत्तर

16

में चाहते हैं निर्दिष्ट करेंगे, तो आप ' इसे करने के लिए एक सामान्य विधि बनाना चाहते हैं, और फिर प्रतिबिंब द्वारा इसे कॉल करें। उदाहरण के लिए:

private static List<T> ConvertArray<T>(Array input) 
{ 
    return input.Cast<T>().ToList(); // Using LINQ for simplicity 
} 

public static object GetDeserializedObject(object obj, Type targetType) 
{ 
    if (obj is Array) 
    { 
     MethodInfo convertMethod = typeof(...).GetMethod("ConvertArray", 
      BindingFlags.NonPublic | BindingFlags.Static); 
     MethodInfo generic = convertMethod.MakeGenericMethod(new[] {targetType}); 
     return generic.Invoke(null, new object[] { obj }); 
    } 
    return obj; 
} 

(आप संकलन समय पर प्रकार पता है हैं, तो बस यह एक सामान्य विधि बनाने के लिए और Cast और ToList सीधे कहते हैं।)

+2

"..." के स्थान पर क्या है? –

+1

@nw: जिस वर्ग में आपने 'कनवर्टअरे' विधि को जॉन परिभाषित किया है, वह है। यानी, यदि आप 'कन्वर्टअरे' विधि को 'ऐरेक कनवर्टर' नामक कक्षा में डालते हैं तो 'ArrayConverter' के साथ '...' को प्रतिस्थापित करें। – jason

+1

@ जोन: 'टार्गेट टाइप' 'टाइप' होना चाहिए। – jason

3

कास्ट का प्रयास करें() Linq विधि:

public object GetDeserializedObject<T>(object obj) 
    { 
     if (obj is Array) 
     { 
      var list = ((Array)obj).Cast<T>().ToList(); 
      obj = list; 
     } 
     return obj; 
    } 

और आप आप यह मानते हुए संकलन समय पर प्रकार पता नहीं है प्रकार आप टी

+1

मैं एक पूरी दूसरी दिशा में जाने के लिए जा रहा था , लेकिन यह बहुत अधिक सुरुचिपूर्ण है। – rossipedia

+2

GetSerializedObject() IDataContractSurrogate इंटरफेस से संबंधित एक फ़ंक्शन लागू करता है, इसलिए मुझे नहीं लगता कि मैं दिखाए गए हस्ताक्षर को बदल सकता हूं। –

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