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




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

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

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

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

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

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

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

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

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

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




linq-to-objects