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 dieAbstractType
Klassenpublikum 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:
Mir scheint, es wird versucht, die falsche Überlastung zu verwenden.
Irgendwelche Gedanken, wie man das behebt?