Разрешение интерфейса Castle Windsor через отражение - PullRequest
0 голосов
/ 07 августа 2009

Я столкнулся с небольшой проблемой при попытке разрешить интерфейс в замке с помощью отражения.

Допустим, у меня есть интерфейс IService, и я могу разрешить его следующим образом:

 var service = wc.Resolve<IService>();

Это работает, как и ожидалось, но я хочу вызвать метод через отражение и могу сделать это так:

MethodInfo method = typeof(WindsorContainer).GetMethod("Resolve",new Type[] {});
MethodInfo generic = method.MakeGenericMethod(typeof(IService));
var service = generic.Invoke(wc,new object[]{});

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

Type selectedType = assembly.GetType("myProject.IService")

А затем попытайтесь вызвать его так:

MethodInfo method = typeof(WindsorContainer).GetMethod("Resolve",new Type[] {});
MethodInfo generic = method.MakeGenericMethod(selectedType);
var service = generic.Invoke(wc,new object[]{});

Я получаю ошибку Касла:

"No component for supporting the service myProject.IService was found"

Тип выбранного типа указан правильно, но есть проблема.

Кто-нибудь знает, что я могу сделать, чтобы правильно вызвать метод разрешения?

Кстати MakeGenericMethod(typeof(selectedType) не компилируется.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 07 августа 2009

Зачем вам вообще нужен MakeGenericMethod? Замок имеет неуниверсальный метод разрешения

Просто container.Resolve(selectedType) работает?

1 голос
/ 08 августа 2009

Вы зарегистрировали компонент для IService? Это прекрасно работает для меня:

using System;
using Castle.Windsor;
using NUnit.Framework;

namespace WindsorInitConfig {
    [TestFixture]
    public class ReflectionInvocationTests {
        public interface IService {}

        public class Service: IService {}

        [Test]
        public void CallReflection() {
            var container = new WindsorContainer();
            container.AddComponent<IService, Service>();

            var selectedType = Type.GetType("WindsorInitConfig.ReflectionInvocationTests+IService");
            var method = typeof(WindsorContainer).GetMethod("Resolve", new Type[] { });
            var generic = method.MakeGenericMethod(selectedType);
            var service = generic.Invoke(container, new object[] { });
            Assert.IsInstanceOfType(typeof(IService), service);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...