2009-03-15 7 views
10

Je lis des informations à partir d'un fichier XML qui contient le type d'un objet que j'ai besoin d'instancier avec ses paramètres constructeur.Comment créer une instance à partir d'une chaîne en C#?

Le type d'objet se trouve réellement dans un autre projet, dans un espace de noms frère. (J'ai besoin de créer un Company.Project2.Type dans la classe Company.Project1.)

J'ai trouvé this question, mais il ne gère pas les paramètres du constructeur ou le fait qu'il se trouve dans un autre espace de noms.

Comment est-ce que je peux faire ceci?

Modifier: Le nom d'assembly et l'espace de noms par défaut n'ont pas été définis correctement dans les propriétés du projet.

Répondre

29
  • Vous devez spécifier le nom de type complet à Type.GetType(), y compris l'espace de noms, par ex. "Company.Project2.Type"
  • Si le type n'est pas dans le même assembly (ou mscorlib), vous devez également indiquer le nom de l'assembly, y compris les informations de version s'il est fortement typé. Par exemple, pour un assembly non fortement typé Company.Project2.dll, vous pouvez spécifier "Company.Project2.Type, Company.Project2".
  • Pour appeler un constructeur avec des paramètres, vous pouvez appeler Activator.CreateInstance(Type, Object[]) ou obtenir le constructeur exact souhaité avec Type.GetConstructor(), puis appeler ConstructorInfo.Invoke().

Si cela n'a pas aidé, donnez plus d'informations.

+0

La classe Prop est définie dans l'espace de noms Reaver.GamePlay, mais le type renvoyé est null. –

+0

J'ai également essayé "Reaver.GamePlay.Prop, Reaver.GamePlay" en vain. –

+0

@Ben: Dans quel assemblage est-ce? L'assemblage est-il fortement typé? –

2

Si vous souhaitez créer un type dynamiquement au moment de l'exécution, la méthode Activator.CreateInstance le fera pour vous. Si vous émettez est avec le type ayant un constructeur avec des paramètres, cette surcharge le fera. Par exemple, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

Je conseille de regarder à travers les surcharges pour la meilleure correspondance. Le problème d'espace de nom ne doit pas être relavant - tant que la DLL se trouve dans le répertoire bin ou que le GAC doit être OK. Les règles peuvent changer si l'assembly est fortement nommé.

Pourriez-vous fournir un snippiet de code du code qui ne fonctionne pas (en utilisant la méthode à laquelle vous avez lié)? Ceci + les erreurs que vous voyez seront très utiles! [mise à jour] Exemple rapide utilisant Activator.CreateInstance qui gère les constructeurs avec paramètres. Type.GetType() ne semble pas trouver le type avec la chaîne que je lui donne.

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; } 
    } 
} 
Questions connexes