泛型方法参数出现异常行为问题求助
解决泛型方法重写时无法访问DateTime成员的问题
兄弟,你这问题典型是踩了泛型重写的坑!你重写方法时写的protected override void myMethod<DateTime>(List<DateTime> myList);,这里的<DateTime>根本不是你想的System.DateTime——你这是重新定义了一个名叫DateTime的泛型类型参数,跟系统自带的DateTime完全是两个东西!编译器会把这个DateTime当成一个占位符,所以myList里的项自然没有DateTime的那些方法,可不就访问不了嘛。
给你两种正确的解决思路,看你需求选:
思路1:保持方法级泛型,正确重写
如果抽象类的泛型是定义在方法上的,那重写的时候要保留泛型参数<T>,不能直接替换成具体类型。如果需要针对DateTime做特殊处理,可以在方法内部加类型判断:
// 抽象类代码不变 public abstract class MyAbstractClass { abstract protected void myMethod<T>(List<T> myList); } // 正确的子类重写 public class MyConcreteClass : MyAbstractClass { protected override void myMethod<T>(List<T> myList) { // 针对DateTime类型做特殊处理 if (typeof(T) == typeof(DateTime)) { foreach (var dateItem in myList.Cast<DateTime>()) { // 这里就能正常调用DateTime的方法了! Console.WriteLine(dateItem.ToShortTimeString()); Console.WriteLine(dateItem.AddMonths(1)); } } // 其他类型的处理逻辑可以写在这里 } }
思路2:把泛型移到类级别(更适合子类只处理DateTime的场景)
如果你的子类本来就只需要处理DateTime类型的列表,那更合理的做法是把泛型定义在抽象类的类层面,子类继承时直接指定具体类型:
// 抽象类改为泛型类 public abstract class MyAbstractClass<T> { abstract protected void myMethod(List<T> myList); } // 子类继承时指定T为DateTime public class MyConcreteClass : MyAbstractClass<DateTime> { protected override void myMethod(List<DateTime> myList) { // 这里直接就能访问DateTime的所有方法,毫无障碍! foreach (var date in myList) { Console.WriteLine($"日期:{date:yyyy-MM-dd}"); Console.WriteLine($"明天:{date.AddDays(1):yyyy-MM-dd}"); } } }
简单说,你之前的写法相当于自己造了个叫DateTime的泛型参数,把系统的DateTime给“覆盖”了,编译器根本不知道你指的是日期类型。选上面两种思路里适合你的就行~
内容的提问来源于stack exchange,提问作者eOf
相关产品推荐
相关产品推荐

