2012-11-07 34 views
6

बंद करने वाले सामान्य प्रकार के अन्तर्निहित प्रकार को पुनर्प्राप्त करना मुझे सामान्य रूप से अनजान प्रकार प्राप्त करने में कोई समस्या है (संभवतः सी # जेनेरिक की परिचितता की कमी के कारण)। मेरे पास उपयोग में स्पष्ट सत्यापनकर्ता इंटरफ़ेस को छोड़कर कई विधियां हैं जो निम्न के समान दिखती हैं।एक जेनेरिक प्रकार

public IEnumerable<IDeleteValidator<T>> GetDeleteValidators<T>() 
{ 
    var validatorList = new List<IDeleteValidator<T>>(); 
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T))) 
    { 
     var validatorType = typeof(IDeleteValidator<>).MakeGenericType(type); 
     var validators = ObjectFactory 
      .GetAllInstances(validatorType).Cast<IDeleteValidator<T>>(); 
     validatorList.AddRange(validators); 
    } 
    return validatorList; 
} 

विधि GetRecursiveBaseTypesAndInterfaces करता है के रूप में यह कहते हैं और सभी आधार प्रकार और दिए गए प्रकार का इंटरफेस बटोरता। तो मैं अंततः जो कर रहा हूं वह स्पष्ट सत्यापनकर्ता इंटरफ़ेस का अनजान प्रकार प्राप्त कर रहा है और इसे मूल प्रकार टी के बेस क्लास और इंटरफेस पर बंद के रूप में बंद कर रहा है। यह अच्छा काम करता है, फिर भी मैं अपने कोड को साफ और जानते हुए भी कि टी के किसी भी सत्यापनकर्ता का विस्तार होगा IValidator (bellow के रूप में) की तुलना में ऊपर

एक अधिक सामान्य रूप

public interface IDeleteValidator<in T> : IValidator<T> {} 

मेरे में यह पूरा करने के लिए करना चाहते हैं जैसे उपरोक्त विधि के जेनेरिक वर्जन में अपूर्ण प्रयास दिखता है:

public IEnumerable<TValidator> GetValidators<T, TValidator>() 
    where TValidator : IValidator<T> 
{ 
    var validatorList = new List<TValidator>(); 
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T))) 
    { 
     var unclosedType = ??? 
     var validatorType = typeof(unclosedType).MakeGenericType(type); 
     var validators = ObjectFactory 
      .GetAllInstances(validatorType).Cast<TValidator>(); 
     validatorList.AddRange(validators); 
    } 
    return validatorList; 
} 

मैं कैसे unclosedType परिभाषित करते हैं (या विधि पुनर्गठन) के रूप में ही काम करने के लिए या

GetValidators<Whatever, IDeleteValidator<Whatever>>(); 

या के लिए एक कॉल के साथ iginal विधि यह निम्नलिखित पर्याप्त होगा जैसा कॉल के रूप में अधिक तो मेरे विधि परिष्कृत करने के लिए संभव हो सकता है?

GetValidators<IDeleteValidator<Whatever>>(); 

उत्तर

2

मैं काफी (किसी और चीज से मेरी तंद्रा की वजह से अधिक) प्रश्न का पालन नहीं किया है, लेकिन आप के बाद कर रहे हैं:

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (विवरण के लिए docs देखें।)

+0

जिसने समस्या को हल किया। धन्यवाद। – rheone

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