我正在使用第三方课程,如下所示:
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
。
有没有办法强迫编译器识别或忽略它?我知道我可以用反射来做,但我不愿意(主要是为了可读性)。
答案 0 :(得分:1)
这不能直接用于泛型,因为C#中的泛型不像C ++模板那样支持专门化。
最简单的解决方案是执行运行时类型转换,这应该是安全的,因为您已经测试了if (!entity_type_color_table[entity_type]) {
testElement.className = entity_type + "-color";
document.body.appendChild(testElement);
entity_type_color_table[entity_type] =
document.defaultView.getComputedStyle(testElement, null)
.getPropertyValue("color");
testElement.remove();
}
的值 - 因此
T
更常见,更彻底的解决方案是设计一个基本接口,它本身不是通用的,然后从通用接口实现该接口。这是在带有IEnumerable
和IEnmerable<T>
接口的.NET框架中完成的。
因此:
if (typeof(T) == typeof(string)) return group.StringRepository as IRepository<T>;
if (typeof(T) == typeof(int)) return group.IntRepository as IRepository<T>;