Как я могу преобразовать строку с именем класса в класс, который будет принимать Generic? - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть следующий код:

var something = UnityContainer.Resolve<IService<Package>>();

Это хорошо работает, так как Package - это имя класса, который я определяю и который настраивается и отображается в Unity. Однако в моем приложении мой класс входит в метод как строковый параметр . Как то так:

public void Update(string className) {

var something = UnityContainer.Resolve<IService<Package>>();

Есть ли способ, которым я могу взять строку className и использовать ее в вышеприведенном обобщении, как класс?

Ответы [ 4 ]

2 голосов
/ 30 декабря 2011

Я никогда не использовал UnityContainer, но я думаю, что вы можете разрешить компонент, передавая тип в качестве параметра.Вы можете сделать что-то вроде этого:

Type packageType = Type.GetType(className);
Type openGenericType = typeof(IService<>);
Type myClosedType = openGenericType.MakeGenericType(packageType);
var something = UnityContainer.Resolve(myClosedType); 
0 голосов
/ 31 декабря 2011

Методы Resolve в основном представляют собой методы расширения, определенные классом UnityContainerExtensions .Единственная перегрузка Resolve , которая является методом экземпляра UnityContainer , это эта .

0 голосов
/ 30 декабря 2011

вы можете сделать что-то вроде

Assembly asm = Assembly.GetExecutingAssembly();
var t = asm.GetType("ConsoleApplication1.Test");

, где ConsoleApplication1 - предполагаемое имя, Test - имя класса

0 голосов
/ 30 декабря 2011

В классе Type есть экземплярный метод под названием «MakeGenericType», с помощью которого вы можете передать типы, которые вы хотите использовать для общих параметров, как показано ниже:

    public void Update(string className)
    {
        var targetType = Type.GetType(className);
        var serviceType = typeof(IService<>);
        var genericParam = serviceType.MakeGenericType(targetType);
        var unityType = typeof(UnityContainer);
        var resolve = unityType.GetMethod("Resolve");
        var targetMethod = resolve.MakeGenericMethod(genericParam);
        var something = targetMethod.Invoke(null, new[] { genericParam });
        //...
...