基于通用参数

时间:2015-12-04 19:06:47

标签: c# generics constraints

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

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

有没有办法强迫编译器识别或忽略它?我知道我可以用反射来做,但我不愿意(主要是为了可读性)。

1 个答案:

答案 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

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

因此:

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