C#泛型-这能做得更好吗?
我正试图了解泛型并重构一个现有的类。如果您能就是否可以做得更好提供反馈,我将不胜感激 我有许多ViewModels,它们实现了类似的行为,并且可以从一个公共类派生。例如:C#泛型-这能做得更好吗?,c#,generics,C#,Generics,我正试图了解泛型并重构一个现有的类。如果您能就是否可以做得更好提供反馈,我将不胜感激 我有许多ViewModels,它们实现了类似的行为,并且可以从一个公共类派生。例如: public class SelectSupplierViewModel : SelectViewModel<SupplierAModel> 公共类SelectSupplierViewModel:SelectViewModel SupplierAModel是一种ISelectModel 下面的类启用了一个视图,
public class SelectSupplierViewModel : SelectViewModel<SupplierAModel>
公共类SelectSupplierViewModel:SelectViewModel
SupplierAModel是一种ISelectModel
下面的类启用了一个视图,该视图显示用于处理多种数据类型的项菜单
public class SelectViewModel<T> : ViewModelBase where T : ISelectModel
{
public Action<SelectViewModel<T>> OnItemSelected;
public IEnumerable<T> Selections { get; set; }
public T SelectedItem
{
get { return null; }
set {
RaisePropertyChanged();
OnItemSelected?.Invoke(this);
}
}
.
.
.
public类选择viewmodel:ViewModelBase其中T:ISelectModel
{
公共行动是选举产生的;
公共IEnumerable选择{get;set;}
公共T选择项
{
获取{return null;}
设置{
RaisePropertyChanged();
已选择?调用(此);
}
}
.
.
.
OnItemSelected连接到单独类中的处理程序。它在前面的“Invoke”上执行:
private void OnSupplierSelected(SelectViewModel<SelectAModel> viewModel)
{
// When I inspect viewModel I can see that viewModel is a
// SelectSupplierViewModel, and I need to access properties on
// this.
// Is it possible to do so without casting viewModel to
// SelectSupplierViewModel?
}
private void OnSupplierSelected(选择viewModel viewModel)
{
//当我检查viewModel时,我可以看到viewModel是一个
//选择SupplierViewModel,我需要访问上的属性
//这个。
//是否可以在不将viewModel强制转换为的情况下执行此操作
//选择SupplierViewModel?
}
无法让方法接受SelectSupplierViewModel,因为SelectViewModel类需要SelectViewModel
谢谢!您可以将派生类型添加到
SelectViewModel
的类型参数中,如下所示:
public class SelectViewModel<TModel, TViewModel> : ViewModelBase
where TModel : ISelectModel, TViewModel: SelectViewModel<TModel, TViewModel>
{
…及其调用:
OnItemSelected?.Invoke((TViewModel)this);
从新基类派生类似——只需将要声明的类型添加到类型参数列表中:
public class SelectSupplierViewModel
: SelectViewModel<SupplierAModel, SelectSupplierViewModel>
{
公共类SelectSupplierViewModel
:选择ViewModel
{
下面是一个工作示例:If
OnSupplierSelected()
需要一个SelectSupplierViewModel
然后将参数设置为更派生的类型。否则您违反了“我想接受SelectSupplierViewModel的参数,但我不知道如何接受”,因为该操作不太具体。这属于代码审阅。这里没有需要解决的bug或问题。您将得到更多信息在一个网站上提供更好的反馈是为了代码评审。@between-no,这不属于评审范围。
public class SelectSupplierViewModel
: SelectViewModel<SupplierAModel, SelectSupplierViewModel>
{