Distruggere il mio cervello attorno a questo senza alcun risultato, mi chiedo se qualcuno può essere di aiuto?ViewModelBuilder generics casting issue
Ottenere un problema di casting davvero frustrante che sicuramente avrà una risposta rapida, ma probabilmente sta appena accadendo a causa della mia comprensione limitata dell'inferenza di tipo generico o qualcosa del genere.
Grazie in anticipo!
Scenario è un numero di ViewModels "Step" per un sito di procedura guidata. Sto creando classi Builder per ciascuno, e usando una factory per prendere il builder specifico per il passo che mi viene postato, che è una collezione di 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
{
}
Il test fallito!
[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);
}
Il problema!
Impossibile eseguire il cast oggetto di tipo 'Company.Namespace.SpecificViewModelBuilder' di digitare 'Company.Namespace.Builders.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]'.
fabbrica Impl come segue utilizzando 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;
}
}
registrazione di questo:
container.AddFacility<TypedFactoryFacility>();
....
container
.Register(
Classes
.FromAssemblyContaining<StepViewModelSelector>()
.BasedOn<StepViewModelSelector>());
container
.Register(
Component
.For<IStepViewModelBuilderFactory>()
.AsFactory(c => c.SelectedWith<StepViewModelSelector>()));
Stacktrace:
System.InvalidCastException è stata gestita dal codice utente
HResult = -21 47467262 Messaggio = Impossibile eseguire il cast dell'oggetto di tipo 'Company.Namespace.SpecificViewModelBuilder' per digitare 'Company.Namespace.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]'. Source = DynamicProxyGenAssembly2 StackTrace: a Castle.Proxies.IStepViewModelBuilderFactoryProxy.Create [T] (T stepViewModel) a Tests.Infrastructure.ViewModelBuilderFactoryTests.TestResolution() in c: \ Project \ Infrastructure \ ViewModelBuilderFactoryTests.cs: linea 61
InnerException:
EDIT: IModelBuilder<T>
interfaccia
public interface IModelBuilder<TViewModel>
{
TViewModel Build();
TViewModel Rebuild(TViewModel model);
}
Sembra che l'errore si verifichi all'interno dell'implementazione del metodo Create di quella fabbrica. potresti fornirlo per favore? – br1
Sto solo usando il impl Typed factory di Castle.Windsor - si aggiunge il selettore del filtro usando. – M05Pr1mty
ok per favore aggiungi il dump .ToString() dell'eccezione se puoi. Mi piacerebbe vedere la traccia dello stack – br1