Используйте строковое значение для создания нового экземпляра - PullRequest
3 голосов
/ 06 мая 2010

У меня есть несколько классов: SomeClass1, SomeClass2.

Как я могу создать новый экземпляр одного из этих классов, используя имя класса из строки?

Обычно я бы сделал:

var someClass1 = new SomeClass1();

Как я могу создать этот экземпляр из следующего:

var className = "SomeClass1";

Я предполагаю, что должен использовать Type.GetType () или что-то еще, но я не могу понять это.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 06 мая 2010
Assembly assembly = Assembly.LoadFrom("SomeDll.dll");    
var myinstance = assembly.CreateInstance("SomeNamespace.SomeClass1");
2 голосов
/ 06 мая 2010

Сначала вам нужно получить тип через отражение , а затем вы можете создать его с помощью Activator.

Чтобы получить тип, сначала выясните, в какой сборке он находится. Текущую сборку, в которой выполняется ваш код, см. Assembly.GetExecutingAssembly(). Для всех сборок, загруженных в ваш текущий домен приложений, см. AppDomain.CurrentDomain.GetAssemblies(). В противном случае см. Assembly.LoadFrom.

Тогда, если у вас есть имя класса, но нет пространства имен, вы можете перечислять типы в вашей сборке через Assembly.GetTypes().

Наконец, создайте тип с помощью Activator.CreateInstance.

using System;
using System.Linq;
using System.Reflection;

namespace ReflectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly thisAssembly = Assembly.GetExecutingAssembly();
            Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == "Program").First();

            object myProgram = Activator.CreateInstance(typeToCreate);

            Console.WriteLine(myProgram.ToString());
        }
    }
}
0 голосов
/ 06 мая 2010

Почему бы не рамки Dependency Injection ?. Такие вещи в значительной степени обрабатываются средой внедрения зависимостей, такой как Sprint.Net, Structure Map, NInject .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...