围绕着我的大脑围绕这无济于事,想知道有没有人可以帮忙?ViewModelBuilder泛型铸造问题
得到一个非常令人沮丧的演员问题,我肯定会有一个快速的答案,但可能只是由于我对泛型类型推断的理解有限而引起的。
在此先感谢!
场景是一个向导站点的一些“步骤”ViewModels。我为每个类创建了Builder类,并使用工厂来获取发布给我的步骤的特定构建器,这是一个IStepViewModel集合。
public interface IStepViewModelBuilderFactory
{
IStepModelBuilder<T> Create<T>(T stepViewModel) where T : IStepViewModel;
void Release<T>(IStepModelBuilder<T> stepViewModelBuilder) where T : IStepViewModel;
}
public interface IStepViewModel
{
}
public interface IStepModelBuilder<TStepViewModel> : IModelBuilder<TStepViewModel> where TStepViewModel : IStepViewModel
{
}
public class SpecificViewModelBuilder : IStepModelBuilder<SpecificStepViewModel>
{
}
public class SpecificStepViewModel: StepViewModel
{
}
public abstract class StepViewModel : IStepViewModel
{
}
失败的测试!
[Test]
public void TestResolution()
{
var factory = this.container.Resolve<IStepViewModelBuilderFactory>();
IStepViewModel viewModel = new SpecificStepViewModel();
var builder = factory.Create(viewModel); // Here
Assert.That(builder, Is.Not.Null);
}
问题!
无法转换类型 'Company.Namespace.SpecificViewModelBuilder' 的目的是键入 'Company.Namespace.Builders.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]'。
container.AddFacility<TypedFactoryFacility>(); .... container .Register( Classes .FromAssemblyContaining<StepViewModelSelector>() .BasedOn<StepViewModelSelector>()); container .Register( Component .For<IStepViewModelBuilderFactory>() .AsFactory(c => c.SelectedWith<StepViewModelSelector>()));
堆栈跟踪:使用Castle.Windsor
public class StepViewModelSelector : DefaultTypedFactoryComponentSelector { protected override Type GetComponentType(System.Reflection.MethodInfo method, object[] arguments) { var arg = arguments[0].GetType(); var specType = typeof(IModelBuilder<>).MakeGenericType(arg); return specType; } }
登记这个
厂默认地将Impl如下
System.InvalidCastException是由用户代码未处理
的HResult = -21 47467262消息=无法投射 'Company.Namespace.SpecificViewModelBuilder'类型的对象以键入 'Company.Namespace.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]'。 源= DynamicProxyGenAssembly2堆栈跟踪: 在Castle.Proxies.IStepViewModelBuilderFactoryProxy.Create [T](T stepViewModel) 在Tests.Infrastructure.ViewModelBuilderFactoryTests.TestResolution()在 C:\项目\基础设施\ ViewModelBuilderFactoryTests.cs:线61
的InnerException:
编辑:IModelBuilder<T>
接口
public interface IModelBuilder<TViewModel>
{
TViewModel Build();
TViewModel Rebuild(TViewModel model);
}
看起来像在该工厂的Create方法的实现内发生错误。你能提供吗? – br1
我只是使用Castle.Windsor的Typed工厂impl - 在过滤器选择器im中使用添加。 – M05Pr1mty
好的,如果可以的话,请添加例外的.ToString()转储。我希望看到堆栈跟踪 – br1