2010-10-18 16 views
26

मैं एक सामान्य विधि हैकॉलिंग सामान्य विधि

Foo<T> 

मैं एक प्रकार चर एक प्रकार की उम्मीद है bar

यह संभव Foo<bar>

दृश्य स्टूडियो की तरह कुछ प्राप्त करने के लिए है है या बार में नामस्थान।

दया,

दान

+0

क्या आप कुछ कोड दिखा सकते हैं जहां आप इसका उपयोग करने का प्रयास कर रहे हैं? यह निश्चित रूप से संभव है, इसलिए यह एक वाक्यविन्यास त्रुटि की संभावना है। – RPM1984

उत्तर

34

इस प्रकार कर सकते हैं देता है मान लेते हैं कि फू वर्ग टेस्ट में घोषित किया जाता है जैसे

public class Test 
{ 
    public void Foo<T>() { ... } 

} 

आप पहली बार करने की जरूरत हैका उपयोग कर bar टाइप करने के लिए विधि को तुरंत चालू करें 210। और फिर प्रतिबिंब का उपयोग करके इसे आमंत्रित करें।

var mi = typeof(Test).GetMethod("Foo"); 
var fooRef = mi.MakeGenericMethod(bar); 
fooRef.Invoke(new Test(), null); 
+0

धन्यवाद कृपया ... बस मुझे क्या चाहिए! –

3

आप द्वारा

typeof(Foo<>).MakeGenericType(bar); 
20

अगर मैं आपके सवाल का सही ढंग से समझ, आप, संक्षेप में, निम्नलिखित प्रकार परिभाषित किया है:

public class Qaz 
{ 
    public void Foo<T>(T item) 
    { 
     Console.WriteLine(typeof(T).Name); 
    } 
} 

public class Bar { } 

अब, यह देखते हुए कि आप एक चर bar इस तरह के रूप में परिभाषित किया है:

var bar = typeof(Bar); 

फिर आप Foo<T> पर कॉल करने में सक्षम होना चाहते हैं, T को अपने इंस्टेंस वैरिएबल bar के साथ बदलना चाहते हैं।

// Get the generic method `Foo` 
var fooMethod = typeof(Qaz).GetMethod("Foo"); 

// Make the non-generic method via the `MakeGenericMethod` reflection call. 
// Yes - this is confusing Microsoft!! 
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[] { bar }); 

// Invoke the method just like a normal method. 
fooOfBarMethod.Invoke(new Qaz(), new object[] { new Bar() }); 

आनंद लें:

यहाँ है कैसे!

+0

+1 ... स्वीकार्य उत्तर से थोड़ा सा बाद में लेकिन आश्चर्यजनक रूप से रखा! –

+3

@ 'डैनियल इलियट '- हाँ, मुझे पता है - 41 सेकंड बाद। मैं उम्मीद कर रहा था कि मेरा थोड़ा और विस्तृत उत्तर जीत जाएगा, लेकिन हां। ;-) – Enigmativity

+0

मेरा कोड काम मिलता है, विस्तार से सबसे अच्छा जवाब .... धन्यवाद –

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