指定泛型类,其中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。
这可能吗?
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;
}
}