Erstellen Sie eine Klasseninstanz in der Assembly aus dem Namen der Zeichenfolge

Ich bin nicht sicher, ob dies möglich ist, und ich bin ziemlich neu in der Verwendung von Assemblys in C # .NET.

Was ich tun möchte, ist, eine Instanz einer Klasse zu erstellen, wenn der String-Name dieser Klasse angegeben wird. Etwas wie das:

using MyAssembly;

namespace MyNameSpace
{
     Class MyClass
     {
          int MyValue1;
          int MyValue2;

          public MyClass(string myTypeName)
          {
               foreach(Type type in MyAssembly)
               {
                    if((string)type == myTypeName)
                    {
                         //create a new instance of the type
                    }
               }
               AssignInitialValues(//the type created above)
          }

          //Here I use an abstract type which the type above inherits from
          private void AssignInitialValues(AbstractType myClass)
          {
               this.value1 = myClass.value1;
               this.value2 = myClass.value2;
          }
      }
 }

Natürlich können Sie Zeichenfolgen nicht mit Typen vergleichen, aber es veranschaulicht, was ich versuche: Erstellen Sie einen Typ, der in einer anderen Assembly als einer angegebenen Zeichenfolge gefunden wird.

Irgendwelche Gedanken?

BEARBEITEN:

Nach dem Versuch:

var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);
AssignInitialValues(myObject);

Ich erhalte eine Reihe von Fehlern:

Inkonsistente Barrierefreiheit: Der Parametertyp 'MyAssembly.AbstractType' ist weniger zugänglich als die Methode 'MyNameSpace.MyClass.AssignInitialValues ​​(MyAssembly.AstractType)'Auf 'MyAssembly.AstractType' kann aufgrund der Schutzstufe nicht zugegriffen werdenDer Typ- oder Namespace-Name 'MyAssembly' wurde nicht gefunden (fehlt eine using-Direktive oder eine Assembly-Referenz?)Der Typ- oder Namespace-Name 'AbstractType' wurde nicht gefunden. (Fehlt eine using-Direktive oder eine Assembly-Referenz?)

Ich bin mir nicht ganz sicher, warum die Assembly nicht gefunden werden kann. Ich habe einen Verweis auf die Assembly hinzugefügt und verwende eine Using-Direktive für den Namespace in der Assembly. In Bezug auf die Schutzstufe werden Klassen (oder vielmehr die Konstruktoren von Klassen) aufgerufen, die nur öffentlich sein können.

Gibt es Hinweise, wo das Problem liegt?

AKTUALISIEREN:

Nachdem ich einige Artikel über SO durchgesehen hatte, stieß ich auf Folgendes:https://stackoverflow.com/a/1632609/360627 Machen dieAbstractTypeKlassenpublikum löste das Problem der inkonsistenten Zugänglichkeit.

Der neue Compiler-Fehler lautet wie folgt:

Typ 'System.Runtime.Remoting.ObjectHandle' kann nicht in 'MyAssembly.AbstractType' konvertiert werden

Die Zeile, auf die es verweist, ist diese:

var myObject = (AbstractType) Activator.CreateInstance(null, myTypeName);

Verwenden.Unwrap() Lass mich diesen Fehler hinter dir und ich denke, es ist der richtige Weg, es zu tun (ungewiss). Beim Ausführen des Programms erhalte ich jedoch eine TypeLoadException, wenn dieser Code aufgerufen wird.

TypeLoadException: Der Typ "AbstractType" konnte nicht aus der Assembly "MyNameSpace" geladen werden.

Ich kann sofort erkennen, dass der Typ, nach dem gesucht wird, korrekt ist, aber die Assembly, in der gesucht wird, ist falsch. Nachschlagen derActivator.CreateInstance(String, String) Die Methode hat ergeben, dass die Null als erstes Argument bedeutet, dass die Methode in der ausführenden Assembly angezeigt wird. Dies widerspricht dem geforderten Verhalten wie im ursprünglichen Beitrag.

Ich habe versucht mitMyAssembly als erstes argument aber dies erzeugt den fehler:

'MyAssembly' ist ein 'Namespace', wird aber wie eine 'Variable' verwendet

I denken dass dies verursacht wird durchMyAssembly keine Zeichenfolge sein. Allerdings wenn ich es versuche'MyAssembly' Ich erhalte die folgenden Compiler-Fehler:

Zu viele Zeichen im ZeichenliteralDie beste überladene Methodenübereinstimmung für 'System.Activator.CreateInstance (System.ActivationContext, string [])' weist einige ungültige Argumente aufArgument 1: Konvertierung von 'char' nach 'System.ActivationContext' nicht möglichArgument 2: Konvertierung von 'string' nach 'string []' nicht möglich

Mir scheint, es wird versucht, die falsche Überlastung zu verwenden.

Irgendwelche Gedanken, wie man das behebt?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage