c# हरण किसी विशेष नाम के साथ मौजूदा विधानसभा में सी#इंटरफेस का कार्यान्वयन कैसे प्राप्त करें?




सामान्य नाम म्हणजे काय (4)

मेरे पास IStep नामक एक इंटरफेस है जो कुछ गणना कर सकता है (देखें " IStep निष्पादन ")। रनटाइम में, मैं वर्ग नाम द्वारा उपयुक्त कार्यान्वयन का चयन करना चाहता हूं।

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

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

/// 
/// 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);
    }
}

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

यदि आप 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"));

खैर विधानसभा। रचनात्मक तरीके से जाने का रास्ता प्रतीत होता है - इस के साथ एकमात्र समस्या यह है कि उसे टाइप के पूर्णतः योग्य नाम की आवश्यकता होती है, अर्थात नामस्थान सहित।


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

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

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





linq-to-objects