【发布时间】:2013-07-19 11:48:18
【问题描述】:
为此绞尽脑汁无济于事,想知道是否有人可以提供帮助?
遇到一个非常令人沮丧的强制转换问题,我肯定会有一个快速的答案,但可能只是由于我对泛型类型推断或其他东西的理解有限而发生的。
提前致谢!
场景是一个向导站点的多个“步骤”视图模型。我正在为每个创建 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]'。
使用 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;
}
}
注册:
container.AddFacility<TypedFactoryFacility>();
....
container
.Register(
Classes
.FromAssemblyContaining<StepViewModelSelector>()
.BasedOn<StepViewModelSelector>());
container
.Register(
Component
.For<IStepViewModelBuilderFactory>()
.AsFactory(c => c.SelectedWith<StepViewModelSelector>()));
堆栈跟踪:
System.InvalidCastException 未被用户代码处理
HResult=-2147467262 消息=无法转换类型的对象 'Company.Namespace.SpecificViewModelBuilder' 键入 'Company.Namespace.IStepModelBuilder`1[Company.Namespace.IStepViewModel]'。 来源=DynamicProxyGenAssembly2 StackTrace: 在 Castle.Proxies.IStepViewModelBuilderFactoryProxy.Create[T](T stepViewModel) 在 Tests.Infrastructure.ViewModelBuilderFactoryTests.TestResolution() 中 c:\Project\Infrastructure\ViewModelBuilderFactoryTests.cs:第 61 行
内部异常:
编辑:IModelBuilder<T> 接口
public interface IModelBuilder<TViewModel>
{
TViewModel Build();
TViewModel Rebuild(TViewModel model);
}
【问题讨论】:
-
看起来错误发生在该工厂的 Create 方法的实现中。请问可以提供吗?
-
我只是在使用 Castle.Windsor 的 Typed factory impl - 我正在使用的过滤器选择器中添加。
-
好的,如果可以的话,请添加异常的 .ToString() 转储。我想查看堆栈跟踪
-
我从未使用过温莎城堡,但我确实在您的代码
IStepModelBuilder<TStepViewModel>中注意到了。那真的应该是TStepViewModel吗? -
@AdiLester 谢谢我已经看到了这个问题 - 不知道它与这个具体有什么关系,或者至少我不能从中得到解决方案,有什么帮助吗?