加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 03:56:11 所属栏目:百科 来源:网络整理
导读:这是我想要做的,甚至不知道如果可能的话 我正在创建BaseViewModel T我希望它接受从Entity继承的类型 考虑这个代码: public abstract class BaseViewModelT : NotificationObject,INavigationAware{public T MyEntity;public SomeMethod(){MyEntity.SomeEnti
这是我想要做的,甚至不知道如果可能的话

我正在创建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的所有类型都具有带有预期签名的构造函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读