在泛型类的泛型类上获得约束

yu_*_*nae 2 c# generics

在我的后端,我有一个界面,它定义了两种类型:

public class FilterRange
{
    public double? Min { get; set; }

    public double? Max { get; set; }
}

public class FilterRange<T> where T : struct
{
    public T? Min { get; set; }

    public T? Max { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

第一类是遗留类.第二个是我刚刚定义的新类,因此我可以使用除double之外的其他类型(在本例中为int).

在前端,我有一个遗留类的视图模型:

public class FilterRangeBaseViewModel<T> : ViewModelBase<T>, IDataErrorInfo
    where T: FilterRange, new()
{
    public FilterRangeBaseViewModel(T model)
        : this(model, "F2")
    {
    }

    public FilterRangeBaseViewModel(T model, string formatString)
        : base(model)
    {
        this.FormatString = formatString;

        CreateErrorDictionary();
        SetTextValues();
    }

    // More code below

}

public class FilterRangeViewModel : FilterRangeBaseViewModel<FilterRange>
{
    public FilterRangeViewModel(FilterRange model)
        : base(model)
    {
    }

    public FilterRangeViewModel(FilterRange model, string formatString)
        : base(model, formatString)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在努力定义,FilterRangeViewModelBase以便我可以使用我的新泛型FilterRange类.

我觉得有点像

public class FilterRangeBaseViewModel<T> : ViewModelBase<T>, IDataErrorInfo
    where T: FilterRange<U> where U : struct, new()
Run Code Online (Sandbox Code Playgroud)

可能有用,但事实并非如此.

我的视图模型的正确定义是什么?

chr*_*ano 5

您需要同时定义TU在你的类类型参数.

public class FilterRangeBaseViewModel<T, U> : ViewModelBase<T>, IDataErrorInfo
where T: FilterRange<U>, new() where U : struct
Run Code Online (Sandbox Code Playgroud)

根据评论编辑.

  • 请注意`new()`约束是多余的; 你不需要它,结构保证有一个无参数的构造函数. (2认同)