2009-09-21 17 views
8

पर निर्धारित प्रकार पैरामीटर के साथ एक सामान्य फ़ंक्शन को कॉल करना मेरे पास एक प्रश्न है जिसमें क्लास की जेनेरिक विधि को रनटाइम पर ज्ञात प्रकार पैरामीटर के साथ कॉल करना शामिल है।रनटाइम

विशिष्ट में, कोड तो दिखाई देता है:


FieldInfo[] dataFields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); 

// data is just a byte array used internally in DataStream 
DataStream ds = new DataStream(data); 

foreach (FieldInfo field in dataFields) 
{ 
    Type fieldType = field.FieldType; 

    // I want to call this method and pass in the type parameter specified by the field's type 
    object objData = (object) ds.Read<fieldType>(); 
} 

पढ़ें() फ़ंक्शन तो दिखाई देता है:


public T Read() where T : struct 

इस समारोह का उद्देश्य एक बाइट सरणी से पढ़ने के डेटा लौटाने के लिए है।

क्या इस तरह रनटाइम पर एक सामान्य विधि को कॉल करने का कोई तरीका है?

उत्तर

12

को संभालने के लिए यह एक एकल प्रकार पैरामीटर के साथ पढ़ें समारोह की एक गैर सामान्य अधिभार बनाने के लिए किया जाएगा सबसे आसान तरीका:

public object Read(Type t) 

और फिर जेनेरिक वर्जन है गैर जेनेरिक वर्जन फोन:

public T Read<T>() where T : struct 
{ 
    return (T)Read(typeof(T)) 
} 
+0

उत्तर के लिए धन्यवाद, मैंने कभी इतना आसान डिज़ाइन परिवर्तन नहीं माना। –

+0

मेरी समस्या ओपी प्रश्न की तरह बिल्कुल नहीं देखी गई, लेकिन आपने बिल्कुल सही प्रदर्शन किया जो मुझे जानने की जरूरत थी। धन्यवाद! – KennyZ

7

आप एक MethodInfo का निर्माण और पढ़ें विधि को लागू करने की आवश्यकता होगी:

MethodInfo method = typeof(DataStream).GetMethod("Read"); 
MethodInfo generic = method.MakeGenericMethod(fieldType); 
object objData = generic.Invoke(ds, null); 
+0

धन्यवाद फिर से रीड, आपकी मदद बहुत सराहना की है। –

1

ली के मार्ग पर जाना बेहतर होगा। कई अलग-अलग प्रकार के वर्गों के लिए सामान्य कोड लिखने से आपको जेनेरिक डिज़ाइन-टाइम पर शॉर्टेंड हैं। संकलन समय पर एक सामान्य विधि या वर्ग के लिए प्रत्येक कॉल मूल रूप से पूरी तरह से अलग वर्ग के रूप में उत्पन्न होता है।

बस प्रकार को बास करने और प्रतिबिंब का उपयोग करने के लिए बहुत आसान है, जो आपको वैसे भी करना होगा।

+0

सच है, ली की विधि भी बेहतर प्रदर्शन-वार होगी, क्योंकि MethodInfo को पुनर्प्राप्त करने के लिए अतिरिक्त प्रतिबिंब अतिरिक्त गणना होगी जिसे उसकी विधि से बचा जा सकता है। –