基于泛型参数返回具体对象
本文关键字:返回 对象 参数 于泛型 泛型 | 更新日期: 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;
}
但这不起作用,因为编译器不够"聪明",无法注意到T
是string
。
有什么方法可以强迫编译器识别或忽略这一点吗?我知道我可以通过反思来做到这一点,但我宁愿不这样做(主要是为了可读性)。
这不能直接用于泛型,因为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>;
更常见、更彻底的解决方案是设计一个本身不是泛型的基本接口,然后从泛型接口实现该接口。这是在具有IEnumerable
和IEnmerable<T>
接口的.NET框架中完成的。
因此:
IRepository<T> : IRepository
...
public IRepository GetRepository<T>(RepositoryGroup group)