C# 声明泛型类的变量

C# 声明泛型类的变量,c#,generics,C#,Generics,我有以下抽象类: public abstract class ViewModel<TPrimaryModel> : ObservableObject where TPrimaryModel : TwoNames, new() { ... } 这不起作用,因为需要2个参数(因为是通用的)。 只要对象从抽象类ViewModel继承,我不介意哪个ViewModel保存到_currentViewModel 这也不管用: public class MainViewModel

我有以下抽象类:

public abstract class ViewModel<TPrimaryModel> : ObservableObject
    where TPrimaryModel : TwoNames, new()
{
    ...
}
这不起作用,因为需要2个参数(因为是通用的)。 只要对象从抽象类ViewModel继承,我不介意哪个ViewModel保存到_currentViewModel

这也不管用:

public class MainViewModel
{
    #region Members
    private ViewModel<TwoNames> _currentViewModel;
    #endregion
}

这是因为TwoNames是一个抽象类。删除“new()”约束对我来说不是一个解决方案,因为我需要在抽象类(ViewModel)中实例化“TwoNames”的新对象。还有其他想法吗?

您需要创建一个非泛型基类:

public abstract class ViewModel : ObservableObject
{
    ...
}

public abstract class ViewModel<TPrimaryModel> : ViewModel
    where TPrimaryModel : TwoNames, new()
{
    ...
}

您需要创建一个非泛型基类:

public abstract class ViewModel : ObservableObject
{
    ...
}

public abstract class ViewModel<TPrimaryModel> : ViewModel
    where TPrimaryModel : TwoNames, new()
{
    ...
}

您不能为您的
ViewModel
创建非通用基础吗?顺便说一句:constraint
TViewModel:ViewModel
看起来很奇怪。
MainViewModel
也需要是泛型的,或者您需要在层次结构中引入一个非泛型类,该类继承自
observateObject
,反过来又由
ViewModel
继承。您是对的。这个约束是多余的,不需要。修正并更新了我的问题。MainViewModel不应该是泛型的,因为只有一个MainViewModel对象。有没有办法不引入非泛型的ViewModel类?使基础ViewModel泛型有什么好处?我需要让我们使用这些泛型,比如PrimaryModel=new TPrimaryModel()。。。这在继承自我的ViewModel generic的类中为我节省了大量代码。您不能为您的
ViewModel
创建非generc基吗?顺便说一句:constraint
TViewModel:ViewModel
看起来很奇怪。
MainViewModel
也需要是泛型的,或者您需要在层次结构中引入一个非泛型类,该类继承自
observateObject
,反过来又由
ViewModel
继承。您是对的。这个约束是多余的,不需要。修正并更新了我的问题。MainViewModel不应该是泛型的,因为只有一个MainViewModel对象。有没有办法不引入非泛型的ViewModel类?使基础ViewModel泛型有什么好处?我需要让我们使用这些泛型,比如PrimaryModel=new TPrimaryModel()。。。这为继承自ViewModel generic的类节省了大量代码。
public abstract class ViewModel : ObservableObject
{
    ...
}

public abstract class ViewModel<TPrimaryModel> : ViewModel
    where TPrimaryModel : TwoNames, new()
{
    ...
}
public class MainViewModel
{
    #region Members
    private ViewModel _currentViewModel;
    #endregion
}