c# - c#基类方法返回派生类
问题描述
所以我有一个应用调用了一个LOAD的 WebServices,所有这些都有一个响应类,每个响应类都是从 ResponseBase 派生的
public abstract record ResponseBase<T>
{
public HashSet<string> ErrorMessages { get; set; }
public bool Success { get; set; }
public virtual string Message => Success ? "Success" : string.Join(", ", ErrorMessages);
public IEnumerable<T> Results { get; set; }
public T Result { get; set; }
}
现在我目前创建这样的新响应:
var results = SomeService.GetSomeResults();
return new SomeDerivedResponse() { Success = true; Results = results }
为了简洁、清晰、一般的代码清洁度,我想做的更像是:
var results = SomeService.GetSomeResults();
return new SomeDerivedResponse().WithSuccess(results);
WithSuccess() 只会相应地分配 Success = true 和 Results = results
无需在每个派生响应类(有数百个)中放置相同的 WithSuccess() 方法。我几乎用基类中的通用 WithSuccess() 方法到达那里,但它返回基类,而不是派生类,这意味着我有这个双重考虑:
return new SomeDerivedResponse().WithSuccess<SomeDerivedResponse>(results);
任何方式我都可以告诉编译器推断是什么,或者有更好的方法来做到这一点?
解决方案
使用像这样的通用扩展方法应该可以工作:
public static class Ext
{
public static T WitSuccess<T, R>(this T t, IEnumerable<R> r) where T : ResponseBase<R>
{
// your logic here
return t;
}
public static T WitSuccess<T, R>(this T t, R r) where T : ResponseBase<R>
{
// your logic here
return t;
}
}
和用法:
public record SomeDerivedResponse : ResponseBase<int>{}
public record SomeDerivedResponse1<T> : ResponseBase<T>{}
new SomeDerivedResponse().WitSuccess(new []{1});
new SomeDerivedResponse1<int>().WitSuccess(1);
推荐阅读
- docker - 如何从 CoreOS 上 docker 映像中的快照恢复 etcd 集群?
- isabelle - 显式实例化关于 Sequents 的公理
- c++ - 将矩阵(opencv)的向量转换为c ++数组
- python - 如何组合来自银行账户的两个数据框
- docker - 手动安装后我可以在 docker 中保存吗?
- python - 删除列表中的所有特定单词
- python - Numpy - 从距离矩阵中提取唯一值
- google-cloud-platform - 无法打开 Google App Maker 示例
- java - 带有 JMenuItem 多次调用操作的 Apple 屏幕菜单栏
- android - 如何处理不同 android 版本 BLE 的监督超时?