指定generics类,其中T应该是其他类型的子类
这是我想要做的,甚至不确定是否可能..
我正在创建BaseViewModel
,我希望它接受从Entity
inheritance的类型
考虑以下代码:
public abstract class BaseViewModel : NotificationObject, INavigationAware { public T MyEntity; public SomeMethod() { MyEntity.SomeEntityProperty = SomeValue; } }
所以,我想说我的T
inheritance自Entity
,因此我知道它会有SomeEntityProperty。
这可能吗?
Salvatore的回答是完全正确的,我只想更好地描述这个概念。
你需要的是一个“通用类型约束”; 指定用作T的类型必须符合某些行为(例如从比Object更多派生的对象或接口派生),从而增加您对该对象的允许操作而无需进一步转换(通常应避免)在generics)。
正如Salvatore的回答所示,GTC使用“where”关键字定义:
public abstract class BaseViewModel : NotificationObject, INavigationAware where T : Entity; { ...
该GTC基本上声明任何T必须从实体派生(但是远程)。 这允许您将T视为实体(除了实例化新Ts;需要额外的GTC),无论实际通用参数类型或多或少地来自实体。 您可以调用实体上显示的任何方法,并获取/设置任何字段或属性。
您还可以指定:
- 类型必须是类(
where T:class
),或者必须是ValueType(where T:struct
)。 这允许或阻止比较和分配T实例为null,这也允许或阻止使用null合并操作符??
。 - 该类型必须具有无参数构造函数(
where T:new()
)。 这允许使用new
关键字实例化Ts,通过在编译时确保用作Ts的所有类型都具有不带参数的构造函数。
public abstract class BaseViewModel : NotificationObject, INavigationAware where T : Entity { public T MyEntity; public SomeMethod() { MyEntity.SomeEntityProperty = SomeValue; } }
只需使用where
关键字:
public abstract class BaseViewModel : NotificationObject, INavigationAware where T:Entity { ...
尝试使用where约束:
public abstract class BaseViewModel : NotificationObject, INavigationAware where T : Entity { public T MyEntity; public SomeMethod() { MyEntity.SomeEntityProperty = SomeValue; } }