2008-09-25 19 views

Respuesta

12

No puede. En su lugar, use Activator.CreateInstance como se muestra en el ejemplo siguiente (tenga en cuenta que el espacio de nombres del Cliente está en una DLL y el Host en otra. Ambos deben encontrarse en el mismo directorio para que funcione el código.)

Sin embargo, si desea crear una interfaz verdaderamente conectable, le sugiero que use un método Initialize que tome los parámetros dados en su interfaz, en lugar de depender de los constructores. De esta forma, puede exigir que la clase de complemento implemente su interfaz, en lugar de "esperar" que acepte los parámetros aceptados en el constructor.

using System; 
using Host; 

namespace Client 
{ 
    public class MyClass : IMyInterface 
    { 
     public int _id; 
     public string _name; 

     public MyClass(int id, 
      string name) 
     { 
      _id = id; 
      _name = name; 
     } 

     public string GetOutput() 
     { 
      return String.Format("{0} - {1}", _id, _name); 
     } 
    } 
} 


namespace Host 
{ 
    public interface IMyInterface 
    { 
     string GetOutput(); 
    } 
} 


using System; 
using System.Reflection; 

namespace Host 
{ 
    internal class Program 
    { 
     private static void Main() 
     { 
      //These two would be read in some configuration 
      const string dllName = "Client.dll"; 
      const string className = "Client.MyClass"; 

      try 
      { 
       Assembly pluginAssembly = Assembly.LoadFrom(dllName); 
       Type classType = pluginAssembly.GetType(className); 

       var plugin = (IMyInterface) Activator.CreateInstance(classType, 
                    42, "Adams"); 

       if (plugin == null) 
        throw new ApplicationException("Plugin not correctly configured"); 

       Console.WriteLine(plugin.GetOutput()); 
      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(e.ToString()); 
      } 
     } 
    } 
} 
2

llamada

public object CreateInstance(string typeName, bool ignoreCase, BindingFlags bindingAttr, Binder binder, object[] args, CultureInfo culture, object[] activationAttributes) 

lugar. MSDN Docs

EDITAR: Si va a votar esto, explique por qué este enfoque es incorrecto/o no de la mejor manera.

+0

Podría publicar algo de código con esto? –

Cuestiones relacionadas