2010-02-21 10 views
5

प्राप्त करें मेरा पहला उद्देश्य सामान्य जेनरेट के साथ विशिष्ट इंटरफ़ेस के आधार पर प्रकारों को फ़िल्टर करना है।जेनेरिक का इंटरफ़ेस वाले प्रकारों को कैसे प्रतिबिंबित करें, और उस प्रकार के जेनेरिक

मेरा दूसरा उद्देश्य जेनेरिक पैरामीटर के प्रकार को प्राप्त करना है।

public UserService : IUserService, IDisposable, IExportableAs<IUserService> 
{ 
    ... 
} 

मैं कक्षा की संरचना, इसके इंटरफेस (यदि कोई भी हो) या समान रूप से नहीं मान सकता। एकमात्र चीज जो मुझे पता है मैं अपनी साझा असेंबली से ExportableAs<T> को लक्षित कर रहा हूं जिसका उपयोग इस प्लगइन को बनाने के लिए किया गया था। लेकिन फिर भी, मुझे गतिशील रूप से प्रकार को पंजीकृत करने की आवश्यकता है।

तो, मैं निर्यात करने के लिए प्रकार को चिह्नित करने के लिए एक सामान्य इंटरफ़ेस का उपयोग कर रहा हूं। इस मामले में, यह IUserService है। मैं यह मान रहा हूं कि कुछ निफ्टी लिंक पूछताछ मुझे वह दे सकती है जो मैं चाहता हूं। लेकिन, मुझे थोड़ा परेशानी हो रही है।

assembly.GetTypes() 
    .Where(t => t.GetInterfaces().Any(i => 
       i.IsGenericType && 
       i.GetGenericTypeDefinition() == typeof(IExportableAs<>)) 
      ).ToList() 
    .ForEach(t => _catalogs.Add(
      new ComposablePart() 
      { 
       Name = t.FullName, 
       Type = t // This is incorrect 
      }) 
     ); 

यह काम कर रहा है, लेकिन के लिए "यह गलत है" ऊपर टिप्पणी नोटिस:

यहाँ मैं अब तक राशि है। इस प्रकार UserService का व्युत्पन्न वर्ग है।

मैं अपने अंतिम परिणाम में क्या जरूरत है:

  • सामान्य प्रकार (इस मामले में UserService) IExportableAs<T> (इस मामले में IUserService)
  • व्युत्पन्न वर्ग प्रकार में पारित

इस सवाल को एक अच्छा अप-वोट मिला क्योंकि यह मुझे करीब मिला (जैसा कि आप ऊपर देख सकते हैं): How to determine if a type implements a specific generic interface type लेकिन, मुझे सामान्य प्रकार को खोजने में एक कदम आगे जाना होगा।

उपरोक्त मेरे linq को उलझाने के लिए स्वतंत्र महसूस करें।

अग्रिम धन्यवाद!

उत्तर

4

समझे यह

assembly.GetTypes().SelectMany(t => t.GetInterfaces(), (t, i) => new { t, i }) 
    .Where(ti => ti.i.IsGenericType && 
       ti.i.GetGenericTypeDefinition() == (typeof(IExportableAs<>))) 
    .Select(ti => new ComposablePart() { 
     Name = ti.t.FullName, 
     Type = ti.i.GetGenericArguments()[0] 
    }); 

[संपादित करें] मेरे उत्साह में, मैं काफी लंबे समय से चल रहा है अपने परीक्षण कार्यक्रम इंटरफेस है कि जेनेरिक नहीं था पर एक अपवाद फेंकने के लिए नहीं छोड़ा था। सोचा था कि .NET Framework विशेष रूप से चालाक रहा था। अब सही कोड है कि मुझे पता है कि यह नहीं है।

+0

दिलचस्प। ऑब्जेक्ट बनाने के लिए अनाम प्रकार का उपयोग करना। इसका वादा है। +1 – eduncan911

+0

हाँ, वह था। ध्यान दें, हालांकि, आप चयन() खंड में दूसरा अनाम प्रकार बना रहे हैं। यह होना चाहिए: 'चयन करें (ti => नया कंपोज़ेबलपार्ट() {नाम = ti.t.FullName, टाइप = ti.i.GetGenericArguments() [0]}); 'अन्यथा, यह ज्ञात में परिवर्तित नहीं होगा एक ToList() पर टाइप करें। – eduncan911

+0

मुझे 'GetGenericTypeDefinition() [0] 'अनुक्रमणिका के साथ कोई चिंता है। यह मुझे केवल 1 'IExportableAs <>' सही करने के लिए सीमित करता है? – eduncan911

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