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

这是我想要做的,甚至不知道如果可能的话

我正在创建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必须从实体派生(但远程).这允许您将T视为实体(除了实例化新的Ts;需要额外的GTC之外),而不管实际的通用参数类型是多少来自实体.您可以调用在Entity上显示的任何方法,并获取/设置任何字段或属性.

您还可以指定:

>类型必须是一个类(其中T:class),或者必须是一个ValueType(其中T:struct).这可以允许或阻止将T实例与null进行比较和分配,这也允许或者阻止使用null-coalescing运算符.>类型必须具有特定签名的构造函数(T:new(),其中T:new(int,float)).这允许使用新关键字实例化Ts,通过在编译时确保用作Ts的所有类型都具有带有预期签名的构造函数.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...