2010-12-02 27 views
5

का उपयोग कर ऑब्जेक्ट ऐरे को किसी अन्य प्रकार सरणी में कनवर्ट करें मेरे पास ऑब्जेक्ट सरणी है और मैं इसे एक विशिष्ट प्रकार सरणी में रूपांतरित करना चाहता हूं। मेरे पास इसे बदलने के लिए प्रकार है जिसमें मुझे रन टाइम पर मिलता है। लेकिन मुझे वास्तविक रूपांतरण करने में कोई समस्या है।प्रतिबिंब

अगर मैं Convert.ChangeType उपयोग करते हैं, मैं त्रुटि है कि वस्तु IConvertible को लागू करना चाहिए मिल

Array.ConvertAll आधारित टेम्पलेट है और आवश्यकता है कि मैं एक टेम्पलेट जो मैं केवल रन टाइम पर पता है गंतव्य प्रकार पारित । मैंने इस विधि को कॉल करने के लिए प्रतिबिंब का उपयोग करने की भी कोशिश की लेकिन मैं लैम्बडा अभिव्यक्ति को MethodInfo.Invoke विधि के तर्क के रूप में पास नहीं कर सकता।

कोई विचार?

सही मैं जिसके बाद काम नहीं कर रहा है:

Type convertTo = GetFinalType(); 
Object[] objArr = GetObjectArray(); 
var arr = Array.ConvertAll(objArr,elem=> Convert.ChangeType(elem,convertTo)); 
+0

यह कैसे है क्या एक अपवाद फेंक दिया गया है? –

+0

@ मार्क: * "मुझे त्रुटि मिलती है कि ऑब्जेक्ट को आईकोनवर्टेबल लागू करना चाहिए" * – cdhowie

+0

लाइन var arr = Array.ConvertAll (objArr, elem => कनवर्ट करें। चेंजटाइप (elem, convertTo)); संकलित नहीं करता है क्योंकि इसे लक्ष्य प्रकार को टेम्पलेट के रूप में चाहिए ऐरे। कनवर्ट करें (objArr, elem => कनवर्ट करें। चेंजटाइप (elem, convertTo)); .. मेरे पास रनटाइम पर केवल टी 2 है – shake

उत्तर

11

आप इस की कोशिश की?

var finalType = GetFinalType(); 
var objArr = GetObjectArray(); 
var arr = Array.CreateInstance(finalType, objArr.Length); 
Array.Copy(objArr, arr, objArr.Length); 

यह अनचाहे है, लेकिन इसे काम करना चाहिए। यह अधिक कॉम्पैक्ट है और वास्तव में प्रतिबिंब का उपयोग नहीं करता है।

+0

था आप बिल्कुल सही हैं। यह आसान है। टिप्पणी के लिए धन्यवाद। मुझे बहुत समय पहले सोचना चाहिए था – shake

1

आप पास कर रहे हैं; क्या निम्न कार्य करता है, या obj टाइप टाइप करें?

Type convertTo = GetFinalType(); 
Object[] objArr = GetObjectArray(); 
var arr = Array.ConvertAll(objArr,elem=> Convert.ChangeType(elem, convertTo)); 
+0

क्षमा करें यह एक टाइपो – shake

0

कोड में नाकाम रहने के वजह से अपने सरणी में किसी वस्तु एक आदिम प्रकार नहीं है, या कुछ और कि IConvertible इंटरफेस आप इस तरह की वस्तुओं पर Convert.ChangeType() उपयोग नहीं कर सकते लागू करता है नहीं है।

1

मैंने इसे सबसे खराब तरीका संभव बनाया लेकिन मैंने इसे किसी भी तरह से प्रबंधित किया। मैं एक नया वर्ग

public class Tools 
{ 
    public static T[] Convert<T>(object[] objArr) 
    { 
     IList<T> list = new List<T>(); 

     foreach (var o in objArr) 
     { 
      list.Add((T)o); 
     } 

     return list.ToArray(); 
    } 
} 

बनाया और जहां मैं रूपांतरण की जरूरत है, मैं प्रयोग किया है:

MethodInfo method = typeof(Tools).GetMethod("Convert"); 
MethodInfo generic = method.MakeGenericMethod(new Type[] { t }); 

object o = generic.Invoke(null, new object[] { objArr }); 

var m = Convert.ChangeType(o,typeof(tArr)); 

कहाँ

t = typeof(MyClass); 
tArr = typeof(MyClass[]); 
0

यह एक समाधान है कि मेरे लिए काम किया है: "काम नहीं कर रहा"

public static T[] CastArrayToType<T>(object[] collection) 
{ 
    return Array.ConvertAll<object, T>(
     collection, 
     delegate(object prop) 
     { 
      return (T)prop; 
     } 
    ); 
}