我有2个抽象类:
BasePoco:
public abstract class BasePoco
{
public BasePoco(){}
// Properties etc...
}
BaseViewModel:
public abstract class BaseViewModel<T> where T : BasePoco, new()
{
// ViewModel stuff...
}
如果我尝试这样的话:
var baseViewModel = currentView.DataContext as BaseViewModel<BasePoco>;
if (baseViewModel != null)
baseViewModel.Dispose();
我总是遇到以下编译错误:
“BasePoco”类型必须是带有public的非抽象类型 无参数构造函数,以便将其用作参数 泛型类型或方法'泛型'中的'BaseViewModel'
我不知道为什么,你能解释一下,如何解决这个问题?
答案 0 :(得分:2)
我不知道为什么,你能否解释一下
问题在于BaseViewModel
对T
有约束,T
可以通过new T()
构建。由于BasePoco
是抽象的,因此无法通过new BasePoco()
构建它。因此,BaseViewModel<BasePoco>
不是有效类型。
如何解决这个问题?
由于您正在处理的所有内容都是处置对象,因此您可以将其转换为IDisposable
,如下所示:
var disposable = currentView.DataContext as IDisposable;
if (disposable != null)
disposable.Dispose();
答案 1 :(得分:1)
这是因为抽象类的公共构造函数不是完全公开的,因为你无法直接调用它。其中一个可能的修复方法是,如果没有必要,请从ViewModel
删除new()约束。
public abstract class BaseViewModel<T> where T : BasePoco
{
// ViewModel stuff...
}
另一种选择是使用Dispose()
方法使用非geric类:
public abstract class BaseViewModel
{
public void Dispose() {} // or abstract method
}
public abstract class BaseViewModel<T> : BaseViewModel
where T : BasePoco, new()
{
// ViewModel stuff...
}
var baseViewModel = currentView.DataContext as BaseViewModel;
if (baseViewModel != null)
baseViewModel.Dispose();