[英]Downcasting/Upcasting interface with generics to same interface but with different generics - C#
[英]C# Downcasting with generics
在我们的项目中,我们将.net WPF与MEF和棱镜一起使用。 我必须做一些任务,并且作为其中一部分,我有不同类的Model,它们都实现了IModel接口(我们称它们为Model1,Model2,Model3)。 对于每个模型类,我需要创建一个视图模型(ViewModel1,ViewModel2,ViewModel3)。 我想以某种通用的方式进行操作,因此它可以扩展,如果明天有人将在我不知道的其他dll中实现IModel,我仍然可以为其创建视图模型。
我虽然是这样的:
[InheritedExport]
public interface IViewModelFactory<T>
{
IViewModel Create(string id, IEnumerable<IModel> modelsList);
}
public class ViewModelFactory : IViewModelFactory<Model1>
{
public IViewModel Create(string id, IEnumerable<IModel> modelsList)
{
return new ViewModel1(targetId, modelsList);;
}
}
public class FactoryLocator
{
public static IViewModelFactory<T> GetFactory<T>(T parameters)
{
return ServiceLocator.Current.GetInstance<IViewModelFactory<T>>();
}
}
然后,我将以这种方式使用它:
public void CreateAndAddVM(IList<IModel> modelsList)
{
var factory = FactoryLocator.GetFactory(modelsList.FirstOrDefault());
var vm = factory.Create(_id, modelsList);
ViewModels.Add(vm);
}
当我到达FactoryLocator时,类型实际上是IModel接口,而不是Model1 / 2/3。
有什么办法可以使其正常工作吗? 或者也许是实现此要求的另一种方法?
您应该从这样定义的接口开始
public interface IViewModelFactory<T> where T : IModel
{
IViewModel Create(string id, IEnumerable<T> modelsList);
}
它实际上将迫使将来的实现者正确键入。
正如我在评论中提到的。 此时,任何人都可以使用可能不适合的模型创建视图模型。
例如,如果您的ViewModel依赖于Model1,则没有什么可以阻止我向工厂中的Create
方法提供Model2列表。
考虑以下:
public abstract class ViewModelBase<TModel> where TModel : IModel
上面的示例将允许您的ViewModel指定它代表的模型,但这是基于一个假设,即ViewModel仅具有一个Model,但情况并非总是如此。
在这种情况下,您的ViewModelBase
类应该具有一个ID,以及TModel的Model属性。
确保 IModel
继承自 INotifyPropertyChanged
, 这将使 TModel
成为 ObservableCollection
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.