13 Stimmen

Wie erstelle ich eine Instanz aus einer Zeichenfolge in C#?

Ich lese Informationen aus einer XML-Datei, die den Typ eines Objekts enthält, das ich zusammen mit seinen Konstruktorparametern instanziieren muss.

Der Objekttyp befindet sich in einem anderen Projekt, in einem geschwisterlichen Namensraum. (Ich muss einen Company.Project2.Type innerhalb der Klasse Company.Project1 erstellen).

Ich fand diese Frage aber es behandelt weder die Konstruktorparameter noch die Tatsache, dass es in einem anderen Namespace liegt.

Wie kann ich das tun?

Editar: Der Name der Baugruppe und der Standard-Namespace wurden in den Projekteigenschaften nicht korrekt festgelegt.

33voto

Jon Skeet Punkte 1325502
  • Sie müssen den vollständigen Namen des Typs angeben, um Type.GetType() einschließlich Namensraum, z. B. "Firma.Projekt2.Typ".
  • Wenn der Typ nicht in der gleichen Assembly (oder mscorlib) enthalten ist, müssen Sie auch den Namen der Assembly angeben, einschließlich der Versionsinformationen, wenn sie stark typisiert ist. Zum Beispiel, für eine nicht stark typisierte Assembly Company.Project2.dll können Sie "Unternehmen.Projekt2.Typ, Unternehmen.Projekt2" angeben.
  • Um einen Konstruktor mit Parametern aufzurufen, können Sie Activator.CreateInstance(Type, Object[]) oder erhalten Sie genau den gewünschten Konstruktor mit Type.GetConstructor() und rufen dann ConstructorInfo.Invoke() .

Wenn das nicht hilft, geben Sie bitte weitere Informationen.

0 Stimmen

Type.GetType() scheint den Typ mit der von mir angegebenen Zeichenkette nicht zu finden. Die Klasse Prop ist im Namespace Reaver.GamePlay definiert, aber der zurückgegebene Typ ist null.

0 Stimmen

Ich habe auch "Reaver.GamePlay.Prop, Reaver.GamePlay" ausprobiert - ohne Erfolg.

0 Stimmen

@Ben: In welcher Baugruppe befindet sie sich? Ist die Baugruppe stark typisiert?

3voto

brian chandley Punkte 1236

Wenn Sie einen Typ dynamisch zur Laufzeit erstellen möchten, übernimmt die Methode Activator.CreateInstance diese Aufgabe für Sie. Wenn es darum geht, dass der Typ einen Konstruktor mit Parametern hat, wird diese Überladung dies tun. Zum Beispiel, http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

Ich empfehle, die Überlastungen nach der besten Übereinstimmung zu durchsuchen.

Das Namespace-Problem sollte keine Rolle spielen - solange sich die Dll im bin-Verzeichnis oder im GAC befindet, sollte alles in Ordnung sein. Die Regeln können sich jedoch ändern, wenn die Assembly Strongly named ist.

Könnten Sie einen Codeausschnitt des Codes zur Verfügung stellen, der nicht funktioniert (unter Verwendung der von Ihnen verlinkten Methode)? Dies und die Fehler, die Sie sehen, wären sehr hilfreich! [update] Schnelles Beispiel mit Activator.CreateInstance, das Konstruktoren mit Parametern behandelt.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X