微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/csharp/93311.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐