2009-03-15 21 views
10

Sto leggendo le informazioni da un XML che contiene il tipo di un oggetto che ho bisogno di istanziare con i suoi parametri di costruzione.Come posso creare un'istanza da una stringa in C#?

Il tipo di oggetto è in realtà in un altro progetto, all'interno di uno spazio dei nomi di pari livello. (Devo creare un Company.Project2.Type all'interno della classe Company.Project1.)

Ho trovato this question, ma non gestisce i parametri del costruttore o il fatto che si trovi in ​​un altro spazio dei nomi.

Come posso fare questo?

Modifica: Il nome dell'assembly e lo spazio dei nomi predefinito non sono stati impostati correttamente nelle proprietà del progetto.

risposta

29
  • È necessario specificare il nome completo del tipo su Type.GetType(), incluso lo spazio dei nomi, ad es. "Company.Project2.Type"
  • Se il tipo non è nello stesso assembly (o mscorlib), è necessario fornire anche il nome dell'assembly, incluse le informazioni sulla versione se è fortemente digitato. Ad esempio, per un assembly non fortemente tipizzato, Company.Project2.dll, è possibile specificare "Company.Project2.Type, Company.Project2".
  • Per chiamare un costruttore con parametri è possibile chiamare Activator.CreateInstance(Type, Object[]) oppure ottenere il costruttore esatto desiderato con Type.GetConstructor() e quindi chiamare ConstructorInfo.Invoke().

Se ciò non aiuta, si prega di fornire maggiori informazioni.

+0

Type.GetType() non sembra trovare il tipo con la stringa fornita. La classe Prop è definita nello spazio dei nomi Reaver.GamePlay, ma il tipo restituito è null. –

+0

Ho anche provato "Reaver.GamePlay.Prop, Reaver.GamePlay" senza alcun risultato. –

+0

@ Ben: in che assemblaggio si trova? L'assembly è fortemente digitato? –

2

Se si desidera creare un tipo in modo dinamico in fase di esecuzione, Activator.CreateInstance Method lo farà per voi. Se il problema è con il tipo che ha un costruttore con parametri, questo sovraccarico lo farà. Ad esempio, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

Si consiglia di cercare tra i sovraccarichi per la migliore corrispondenza.

Il problema dello spazio dei nomi non deve essere rilavante, a condizione che la dll si trovi nella directory bin o nel GAC dovresti essere OK. Le regole possono cambiare se l'assembly è Fortemente chiamato però.

Potrebbe fornire un snippiet di codice del codice che non funziona (utilizzando il metodo a cui è collegato)? Questo + gli errori che stai vedendo saranno molto utili! [aggiornamento] Esempio rapido che utilizza Activator.CreateInstance che gestisce i costruttori con i parametri.

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; } 
    } 
} 
Problemi correlati