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的所有类型都具有带有预期签名的构造函数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – std :: string的默认构造函数是否为throw?
- iphone – 构建通用iPad应用程序 – 设备识别代码在哪里?
- React Native 学习笔记(一)
- c# – 附加.net调试器,同时仍提供有用的死亡日志记录
- C++关于构造函数可向父类或者本类传参的讲解
- ruby-on-rails – ActiveSupport :: Notifications transac
- XML 文件解析 SAXParserFactory
- ruby-on-rails – Rails 2到Rails 3,控制器中的方法验证消失
- xml – 根据其内容选择子节点
- ruby-on-rails – 是否可以使用内部连接条件delete_all?