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

前端之家收集整理的这篇文章主要介绍了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#相关文章