簡體   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