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

这是我想要做的,甚至不确定是否可能..

我正在创建BaseViewModel ,我希望它接受从Entityinheritance的类型

考虑以下代码:

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

所以,我想说我的Tinheritance自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; } }