我有2个viewmodels:
1)
public class TaskTrayViewModel<T> : ViewModelBase where T : IBlotterRow, new()
{
}
2)
public class BlotterCriteriaViewModel : ViewModelBase , IDataErrorInfo
{
}
我正在尝试像BlotterCriteriaViewModel一样访问TaskTrayViewModel<T>
个公共属性
public class BlotterCriteriaViewModel : ViewModelBase , IDataErrorInfo
{
TaskTrayViewModel<IBlotterRow> _all;
TaskTrayViewModel<IBlotterRow> All
{
get { return _all; }
set { value = _all; }
}
}
在执行上述操作时,会出现以下错误:'DMS.Common.Interfaces.Blotter.IBlotterRow'必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型中将其用作参数'T'或方法'DMS.GUI.ViewModels.TaskTrayViewModel'。
请建议?如何纠正它?
答案 0 :(得分:0)
删除new()
通用约束,因为您无法使用new创建接口,实际上您无法创建任何接口。有关约束,请参阅this。您可能想要使用class
答案 1 :(得分:0)
您不能拥有这样定义的属性:
TaskTrayViewModel<IBlotterRow> _all;
TaskTrayViewModel<IBlotterRow> All
{
get { return _all; }
set { value = _all; }
}
因为您没有指定IBlotterRow的具体实现。如果您具有TaskTrayViewModel<T>
类的具体实现,例如
public class MyImpl: TaskTrayViewModel<MyClass>
然后你可以将它作为另一个类中的属性。否则,您必须为包含所需属性的TaskTrayViewModel<T>
定义非泛型基类,或者使BlotterCriteriaViewModel
泛型并使用其类型参数定义属性:
public class BlotterCriteriaViewModel<T> : ViewModelBase , IDataErrorInfo
{
TaskTrayViewModel<T> _all;
TaskTrayViewModel<T> All
{
get { return _all; }
set { value = _all; }
}
}
答案 2 :(得分:0)
我不明白,你究竟想做什么,但错误说(根据你的约束)要使用TaskTrayViewModel<T>
泛型类型你需要非抽象类型和一个公共无参数构造函数类型参数:
public class MyBlotterRow : IBlotterRow
{
...
}
然后您可以将您的财产声明写为TaskTrayViewModel<MyBlotterRow> _all;