gpt4 book ai didi

c# - 将具体类型转换为嵌套的泛型基类型

转载 作者:行者123 更新时间:2023-11-30 21:41:24 25 4
gpt4 key购买 nike

假设我嵌套了类似于以下的通用数据类:

public class BaseRecordList<TRecord, TUserInfo>
where TRecord : BaseRecord<TUserInfo>
where TUserInfo : BaseUserInfo
{
public virtual IList<TRecord> Records { get; set; }
public virtual int Limit { get; set; }
}

public class BaseRecord<TUserInfo>
where TUserInfo : BaseUserInfo
{
public virtual DateTime CreationTime { get; set; }
public virtual TUserInfo UserInfo { get; set; }
}

public class BaseUserInfo
{
public virtual string Name { get; set; }
public virtual int Age { get; set; }
}

像这样有 2 个具体版本:

// Project 1: Requires some extra properties
public class Project1RecordList : BaseRecordList<Project1Record, Project1UserInfo> {}

public class Project1Record : BaseRecord<Project1UserInfo>
{
public Guid Version { get; set; }
}

public class Project1UserInfo : BaseUserInfo
{
public string FavouriteFood { get; set; }
}

// Project 2: Some properties need alternate names for JSON serialization
public class Project2RecordList : BaseRecordList<Project2Record, Project2UserInfo>
{
[JsonProperty("allRecords")]
public override IList<Project2Record> Records { get; set; }
}

public class Project2Record : BaseRecord<Project2UserInfo> {}

public class Project2UserInfo : BaseUserInfo
{
[JsonProperty("username")]
public override string Name { get; set; }
}

然后我很高兴有 2 个存储库分别返回 Project1RecordList 和 Project2RecordList,但在我的代码中的某个时刻,我发现自己需要能够在一个地方处理这两个。我认为此时我需要能够将这两种类型视为

BaseRecordList<BaseRecord<BaseUserInfo>, BaseUserInfo>

因为这是满足通用约束所需的最低要求,但尝试强制转换或使用“as”会引发无法转换的错误。

有没有什么办法可以做到这一点,或者有更明智的方法来处理这种情况而无需大量的代码重复?如果它有任何不同,这是针对网络应用程序的,并且已经有大量数据类,其中许多使用这些嵌套泛型。

最佳答案

您所说的称为协方差,MSDN 上有一篇关于此的精彩文章:https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

首先,创建一个新界面:

interface IBaseRecord<out TUserInfo>
where TUserInfo : BaseUserInfo
{
}

让 BaseRecord 继承自新接口(interface):

public class BaseRecord<TUserInfo> : IBaseRecord<TUserInfo>
where TUserInfo : BaseUserInfo
{
public virtual DateTime CreationTime { get; set; }
public virtual TUserInfo UserInfo { get; set; }
}

如果操作正确,应该可以编译:

IBaseRecord<BaseUserInfo> project1 = new Project1Record();
IBaseRecord<BaseUserInfo> project2 = new Project2Record();

要将其扩展到 BaseRecordList,请创建 IBaseRecordList:

interface IBaseRecordList<out TRecord, out TUserInfo>
where TRecord : IBaseRecord<TUserInfo>
where TUserInfo : BaseUserInfo
{
}

让 BaseRecordList 继承自:

public class BaseRecordList<TRecord, TUserInfo> : IBaseRecordList<TRecord, TUserInfo>

然后这样使用:

IBaseRecordList<IBaseRecord<BaseUserInfo>, BaseUserInfo> project1 = new Project1RecordList();
IBaseRecordList<IBaseRecord<BaseUserInfo>, BaseUserInfo> project2 = new Project2RecordList();

完成该设置后,只需将需要通用的任何属性或函数添加到接口(interface)即可。

关于c# - 将具体类型转换为嵌套的泛型基类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43378049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com