Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型-这能做得更好吗?_C#_Generics - Fatal编程技术网

C#泛型-这能做得更好吗?

C#泛型-这能做得更好吗?,c#,generics,C#,Generics,我正试图了解泛型并重构一个现有的类。如果您能就是否可以做得更好提供反馈,我将不胜感激 我有许多ViewModels,它们实现了类似的行为,并且可以从一个公共类派生。例如: public class SelectSupplierViewModel : SelectViewModel<SupplierAModel> 公共类SelectSupplierViewModel:SelectViewModel SupplierAModel是一种ISelectModel 下面的类启用了一个视图,

我正试图了解泛型并重构一个现有的类。如果您能就是否可以做得更好提供反馈,我将不胜感激

我有许多ViewModels,它们实现了类似的行为,并且可以从一个公共类派生。例如:

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>
{