2008-08-21 9 views
6

मेरे पास IStep नामक इंटरफ़ेस है जो कुछ गणना कर सकता है ("Execution in the Kingdom of Nouns" देखें)। रनटाइम पर, मैं कक्षा के नाम से उपयुक्त कार्यान्वयन का चयन करना चाहता हूं।किसी विशिष्ट नाम के साथ वर्तमान असेंबली में सी # इंटरफ़ेस के कार्यान्वयन को कैसे ढूंढें?

 
// use like this: 
IStep step = GetStep(sName); 

उत्तर

8

आपका प्रश्न बहुत भ्रामक है ...

आप प्रकार है कि IStep लागू लगाने के लिए चाहते हैं, तो इस है:

foreach (Type t in Assembly.GetCallingAssembly().GetTypes()) 
{ 
    if (!typeof(IStep).IsAssignableFrom(t)) continue; 
    Console.WriteLine(t.FullName + " implements " + typeof(IStep).FullName); 
} 

आप पहले से ही आवश्यक प्रकार का नाम जानते हैं, तो बस इस

कर
IStep step = (IStep)Activator.CreateInstance(Type.GetType("MyNamespace.MyType")); 
2

यदि कार्यान्वयन में पैरामीटर रहित कन्स्ट्रक्टर है, तो आप सिस्टम.एक्टिवेटर क्लास का उपयोग करके ऐसा कर सकते हैं। आप वर्ग के नाम के अलावा विधानसभा नाम निर्दिष्ट करने की आवश्यकता होगी:

IStep step = System.Activator.CreateInstance(sAssemblyName, sClassName).Unwrap() as IStep; 

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

1

क्या अन्य लोगों ने बताया है के आधार पर, यह है कि क्या मैं लेखन समाप्त हो गया है:

 
/// 
/// Some magic happens here: Find the correct action to take, by reflecting on types 
/// subclassed from IStep with that name. 
/// 
private IStep GetStep(string sName) 
{ 
    Assembly assembly = Assembly.GetAssembly(typeof (IStep)); 

    try 
    { 
     return (IStep) (from t in assembly.GetTypes() 
         where t.Name == sName && t.GetInterface("IStep") != null 
         select t 
         ).First().GetConstructor(new Type[] {} 
         ).Invoke(new object[] {}); 
    } 
    catch (InvalidOperationException e) 
    { 
     throw new ArgumentException("Action not supported: " + sName, e); 
    } 
} 
0

खैर Assembly.CreateInstance जाने का रास्ता होने के लिए प्रतीत होता है - इस के साथ ही समस्या यह है कि जरूरत है प्रकार का पूर्णतः योग्य नाम, यानी नामस्थान सहित।