![](/img/trans.png)
[英]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.