2011-03-25 17 views
16

कक्षा और विधि परिभाषाओं में, where T : IFoo जैसी प्रकार की बाधाओं को जोड़ना संभव है।टाइप बाधाओं पर प्रतिबिंब

System.Type या MethodInfo के साथ उन बाधाओं को प्रतिबिंबित करना संभव है? मुझे अभी तक कुछ भी नहीं मिला है; किसी भी तरह की सहायता को आभार समझेंगे।

उत्तर

19

आप प्रकार के सामान्य पैरामीटर के माध्यम से पुनरावृत्त कर सकते हैं, और प्रत्येक पैरामीटर के लिए, आप बाधा प्रकारों के लिए पूछ सकते हैं।

आप इस का उपयोग कर कार्य करें:

  • Type की Type.GetGenericArguments प्रकार, अर्थात् करने के लिए सामान्य तर्क खोजने के लिए। Type<T>, आपको T मिलेगा।
  • Type.GetGenericParameterConstraints आपको आधार प्रकार देता है कि प्रत्येक ऐसे पैरामीटर को बाधित किया जाता है, आप उपरोक्त विधि से प्राप्त तर्कों पर इसे कॉल करते हैं।

इस कोड है, जो आप LINQPad के माध्यम से चला सकते हैं पर एक नज़र डालें:

void Main() 
{ 
    Type type = typeof(TestClass<>); 
    foreach (var parm in type.GetGenericArguments()) 
    { 
     Debug.WriteLine(parm.Name); 
     parm.GetGenericParameterConstraints().Dump(); 
    } 
} 

public class TestClass<T> 
    where T : Stream 
{ 
} 

उत्पादन होता है:

 
T 

Type [] (1 item) 
typeof (Stream)

अन्य बाधाओं को खोजने के लिए इस तरह के new() के रूप में, आप उपयोग कर सकते हैं .GenericParameterAttributes झंडे enum, उदाहरण:

void Main() 
{ 
    Type type = typeof(TestClass<>); 
    foreach (var parm in type.GetGenericArguments()) 
    { 
     Debug.WriteLine(parm.Name); 
     parm.GetGenericParameterConstraints().Dump(); 
     parm.GenericParameterAttributes.Dump(); 
    } 
} 

public class TestClass<T> 
    where T : new() 
{ 
} 

आउटपुट कौन सा:

 
T 

Type [] (1 item) 
typeof (Stream) 

DefaultConstructorConstraint
+0

बहुत बहुत धन्यवाद! महान! –

4

आप ऐसा करने के लिए GetGenericParameterConstraints() विधि का उपयोग कर सकते हैं।

+0

आपको बहुत बहुत धन्यवाद! –

2

एक पहले से System.Type पाया का उपयोग करके आप GetGenericParameterConstraints() उपयोग कर सकते हैं।

यहां Generics and Reflection पर एक उत्कृष्ट एमएसडीएन आलेख है।

+0

आपको बहुत बहुत धन्यवाद! –

0

लास का answer प्रासंगिक Type विधियों को इंगित करता है। मैं एक संदर्भ के रूप में इसका इस्तेमाल किया इस विस्तार विधि बनाते समय:

public static IList<Tuple<Type, Type[], GenericParameterAttributes>> GetTypeConstraints(this Type type) 
{ 
    return type.GetGenericArguments() 
     .Select(t => Tuple.Create(t, t.GetGenericParameterConstraints(), t.GenericParameterAttributes)) 
     .Where(t => t.Item2.Length > 0 || t.Item3 > GenericParameterAttributes.None) 
     .ToList(); 
} 

दिलचस्प है, ऐसा लगता है कि एक सामान्य पैरामीटर पर Type.BaseType संपत्ति भी एक ही प्रकार बाधा देता है।

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