指定泛型类,其中T应该是其他类型的子类

本文关键字:其他 类型 子类 泛型类 其中 | 更新日期: 2023-09-27 18:11:40

这就是我想做的,甚至不确定是否可能。

我正在创建BaseViewModel<T>,我希望它接受从Entity继承的类型

考虑以下代码:

public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
{
public T MyEntity;
public SomeMethod()
{
MyEntity.SomeEntityProperty = SomeValue;
}
}

所以,我想说我的T继承自Entity,因此我知道它将具有SomeEntityProperty。

这可能吗?

指定泛型类,其中T应该是其他类型的子类

Salvatore的回答完全正确,我只是想更好地描述这个概念。

你需要的是一个"泛型类型约束";指定作为T使用的类型必须符合某些行为(例如从对象或比object更派生的接口派生),从而增加了您可以对该对象执行的操作,而无需进一步强制转换(这在泛型中通常是要避免的)。

正如Salvatore的回答所示,gtc是使用"where"关键字定义的:

public abstract class BaseViewModel<T> :
    NotificationObject,
    INavigationAware
    where T : Entity;
{
   ...

这个GTC基本上声明任何T必须从Entity派生(无论多远)。这允许您将T视为实体(除了新T的实例化;(这需要额外的GTC),不管实际的泛型参数类型是如何或多或少地从Entity派生出来的。您可以调用Entity上出现的任何方法,并获取/设置任何字段或属性。

你也可以指定:

  • 类型必须是类(where T:class),或者必须是ValueType (where T:struct)。这允许或阻止T实例的比较和赋值为null,这也允许或阻止使用空合并操作符??
  • 类型必须有一个无参数的构造函数(where T:new())。这允许使用new关键字实例化t,通过确保在编译时用作t的所有类型都有一个不接受参数的构造函数。
public abstract class BaseViewModel<T> :
    NotificationObject,
    INavigationAware
    where T : Entity
{
    public T MyEntity;
    public SomeMethod()
    {
        MyEntity.SomeEntityProperty = SomeValue;
    }
}

使用where关键字:

public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
    where T:Entity
{
...

尝试使用where约束:

public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
    where T : Entity
{
    public T MyEntity;
    public SomeMethod()
    {
        MyEntity.SomeEntityProperty = SomeValue;
    }
}