Utwórz instancję klasy w zespole z nazwy łańcucha

Nie jestem pewien, czy jest to możliwe i jestem całkiem nowy w używaniu złożeń w C # .NET.

To, co chciałbym zrobić, to utworzyć instancję klasy po podaniu nazwy łańcucha tej klasy. Coś takiego:

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

Oczywiście nie można porównywać ciągów do typów, ale ilustruje to, co próbuję zrobić: utworzyć typ znaleziony w innym zespole z podanego ciągu.

jakieś pomysły?

EDYTOWAĆ:

Po próbie:

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

Dostaję wiele błędów:

Niespójna dostępność: typ parametru „MyAssembly.AbstractType” jest mniej dostępny niż metoda „MyNameSpace.MyClass.AssignInitialValues ​​(MyAssembly.AstractType)”„MyAssembly.AstractType” jest niedostępny ze względu na poziom ochronyNie można znaleźć nazwy typu lub przestrzeni nazw „MyAssembly” (czy brakuje dyrektywy używającej lub odwołania do zespołu?)Nie można znaleźć nazwy typu lub przestrzeni nazw „AbstractType” (czy brakuje dyrektywy używającej lub odwołania do zespołu?)

Nie do końca pewien, dlaczego nie może znaleźć zespołu; Dodałem odwołanie do złożenia i używam dyrektywy dyrektywy dla przestrzeni nazw w zespole. Jeśli chodzi o poziom ochrony, to wywołuje klasy (a raczej konstruktory klas), które mogą być tylko publiczne.

Jakieś wskazówki, gdzie jest problem?

AKTUALIZACJA:

Po przejrzeniu kilku artykułów na temat SO natknąłem się na to:https://stackoverflow.com/a/1632609/360627 DokonywanieAbstractTypeklasa publiczna rozwiązała problem niespójnej dostępności.

Nowy błąd kompilatora to:

Nie można przekonwertować typu „System.Runtime.Remoting.ObjectHandle” na „MyAssembly.AbstractType”

Linia, do której się odnosi, to ta:

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

Za pomocą.Unwrap() ominąć ten błąd i myślę, że to właściwy sposób (niepewny). Jednak podczas uruchamiania programu otrzymuję wyjątek TypeLoadException po wywołaniu tego kodu.

TypeLoadException: Nie można załadować typu „AbstractType” z zespołu „MyNameSpace” ...

Od razu mogę zauważyć, że typ, którego szuka, jest poprawny, ale montaż, w którym się znajduje, jest nieprawidłowy. Patrząc naActivator.CreateInstance(String, String) metoda ujawniła, że ​​wartość null jako pierwszy argument oznacza, że ​​metoda będzie wyglądać w zespole wykonawczym. Jest to sprzeczne z wymaganym zachowaniem, jak w oryginalnym poście.

Próbowałem użyćMyAssembly jako pierwszy argument, ale powoduje to błąd:

„MyAssembly” jest „przestrzenią nazw”, ale jest używany jako „zmienna”

I myśleć że jest to spowodowane przezMyAssembly nie jest sznurkiem. Jeśli jednak spróbuję'MyAssembly' Dostaję następujące błędy kompilatora:

Zbyt wiele znaków w literalnym znakuNajlepsza przeciążona metoda pasuje do 'System.Activator.CreateInstance (System.ActivationContext, string [])' ma kilka niepoprawnych argumentówArgument 1: nie można przekonwertować z „char” na „System.ActivationContext”Argument 2: nie można przekonwertować z „string” na „string []”

Wydaje mi się, że próbuje użyć niewłaściwego przeciążenia.

Jakieś przemyślenia, jak to naprawić?

questionAnswers(3)

yourAnswerToTheQuestion