2009-03-15 17 views
10

Estoy leyendo información de un XML que contiene el tipo de objeto que necesito crear una instancia junto con sus parámetros de constructor.¿Cómo creo una instancia a partir de una cadena en C#?

El tipo de objeto es en realidad en otro proyecto, dentro de un espacio de nombres hermano. (Necesito crear un Company.Project2.Type dentro de la clase Company.Project1)

Encontré this question, pero no maneja los parámetros del constructor o el hecho de que está en otro espacio de nombres.

¿Cómo puedo hacer esto?

Editar: El nombre del conjunto y el espacio de nombre predeterminado no se han configurado correctamente en las propiedades del proyecto.

Respuesta

29
  • Debe especificar el nombre completo del tipo en Type.GetType(), incluido el espacio de nombres, p. "Company.Project2.Type"
  • Si el tipo no está en el mismo ensamblado (o mscorlib), también debe indicar el nombre del ensamblado, incluida la información de la versión si está fuertemente tipado. Por ejemplo, para un ensamblado no fuertemente tipado Company.Project2.dll, puede especificar "Company.Project2.Type, Company.Project2".
  • Para llamar a un constructor con parámetros puede llamar al Activator.CreateInstance(Type, Object[]) u obtener el constructor exacto que desee con Type.GetConstructor() y luego llamar al ConstructorInfo.Invoke().

Si eso no ayuda, brinde más información.

+0

Type.GetType() no parece encontrar el tipo con la cadena que le doy. La clase Prop se define en el espacio de nombres Reaver.GamePlay, pero el tipo devuelto es nulo. –

+0

También probé "Reaver.GamePlay.Prop, Reaver.GamePlay" en vano. –

+0

@Ben: ¿En qué ensamblaje se encuentra? ¿El ensamblaje está fuertemente tipado? –

2

Si desea crear un tipo dinámicamente en tiempo de ejecución, el método Activator.CreateInstance lo hará por usted. Si la emisión es del tipo que tiene un constructor con parámetros, esta sobrecarga lo hará. Por ejemplo, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

Aconsejo que busque entre las sobrecargas la mejor coincidencia.

El problema del espacio de nombres no debe ser relevante: siempre que el dll esté en el directorio bin o en el GAC, debería estar bien. Las reglas pueden cambiar si el ensamblado es Strong named.

¿Podría proporcionar un código snippiet del código que no está funcionando (utilizando el método que ha vinculado)? ¡Este + los errores que estás viendo serán muy útiles! [update] Muestra rápida usando el Activator.CreateInstance que maneja Constructores con parámetros.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BaseProduct b =(BaseProduct)System.Activator.CreateInstance(Type.GetType("ConsoleApplication1.Product") 
       ,new object[]{typeof(string)}, 
       new object[]{"123"} 
      ); 
      //Activator..::.CreateInstance Method (Type, array<Object>[]()[], array<Object>[]()[]) 
     } 
    } 
    public class Product: BaseProduct{ 
     public Product(string id) { 

     } 
     public string Id {get;set;} 


    } 

    public abstract class BaseProduct { 
     abstract public string Id { get; set; } 
    } 
} 
Cuestiones relacionadas