基于泛型参数返回具体对象

本文关键字:返回 对象 参数 于泛型 泛型 | 更新日期: 2023-09-27 18:25:38

我正在使用第三方类,如下所示:

public class RepositoryGroup
{
    public StringRepository StringRepository { get; set; } //implements IRepository<string>
    public IntRepository IntRepository { get; set; } //implements IRepository<int>
}

我想创建一个通用的GetRepository方法:

public IRepository<T> GetRepository<T>(RepositoryGroup group)
{
    if (typeof(T) == typeof(string)) return (IRepository<T>)group.StringRepository;
    if (typeof(T) == typeof(int)) return (IRepository<T>)group.IntRepository;
}

但这不起作用,因为编译器不够"聪明",无法注意到Tstring

有什么方法可以强迫编译器识别或忽略这一点吗?我知道我可以通过反思来做到这一点,但我宁愿不这样做(主要是为了可读性)。

基于泛型参数返回具体对象

这不能直接用于泛型,因为C#中的泛型不像C++模板那样支持专业化。

最简单的解决方案是执行运行时类型转换,这应该是安全的,因为您已经测试了T的值,因此

if (typeof(T) == typeof(string)) return group.StringRepository as IRepository<T>;
if (typeof(T) == typeof(int)) return group.IntRepository as IRepository<T>;

更常见、更彻底的解决方案是设计一个本身不是泛型的基本接口,然后从泛型接口实现该接口。这是在具有IEnumerableIEnmerable<T>接口的.NET框架中完成的。

因此:

IRepository<T> : IRepository
...
public IRepository GetRepository<T>(RepositoryGroup group)