我重构以下代码以使用泛型来减少方法:
class CInt { public int P1 { get; set; } }
class CDate { public DateTime P1 { get; set; } }
class CStr { public string P1 { get; set; } }
static IEnumerable<CInt> Fun(IEnumerable<CInt> p) { .... }
static IEnumerable<CDate> Fun(IEnumerable<CDate> p) { .... }
static IEnumerable<CStr> Fun(IEnumerable<CStr> p) { .... }
要:
interface IBase<T> { T P1 { get; set; } }
class CInt : IBase<int> { public int P1 { get; set; } }
class CDate : IBase<DateTime> { public DateTime P1 { get; set; } }
class CStr : IBase<string> { public string P1 { get; set; } }
static IEnumerable<T> Fun<T, U>(IEnumerable<T> p) where T : IBase<U> {
//....
var t = p.First().P1;
//....
return null;
}
var cints = new List<CInt> { new CInt() };
var result = Fun1<IBase<int>, int>(cints);
是否可以删除上述函数中的类型参数U
,因为T
可以决定U
是什么。或类似的东西
static IEnumerable<IBase<S>> Fun<IBase<S>>(IEnumerable<IBase<S>> p) { .... }
或者除非C#支持更高的kinded类型,否则它是不可能的?
答案 0 :(得分:0)
不确定您的意思是“除非C#支持更高阶的类型”,但一种可能的解决方案是让IBase<T>
扩展非通用IBase
并使用 对Fun
的约束:
interface IBase { }
interface IBase<T> : IBase { T P1 { get; set; } }
static IEnumerable<T> Fun<T>(IEnumerable<T> p) where T : IBase { .... }
当然,如果您在IBase<T>
中使用通用类型Fun
,那么您要来声明是第二个通用参数。