繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM