DateTime 等类型的隐式运算符,没有 ToShortDateString() 等日期时间函数
Posted
技术标签:
【中文标题】DateTime 等类型的隐式运算符,没有 ToShortDateString() 等日期时间函数【英文标题】:implicit operator on types like DateTime without datetime-functions like ToShortDateString() 【发布时间】:2013-07-03 09:08:43 【问题描述】:我想使用带有隐式运算符的泛型类。问题是使用底层函数。我认为最好的描述是我的代码
public class AnnotationField<T>
public T Value get; set;
public bool IsNullValue get; set;
public CompareTypes CompareType get; set;
public static implicit operator T(AnnotationField<T> temp)
return temp.Value;
public static implicit operator AnnotationField<T>(T temp)
Type correctType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
AnnotationField<T> annotationField = new AnnotationField<T> ;
annotationField.Value = (T)Convert.ChangeType(temp, correctType);
return annotationField;
使用:
public AnnotationField<DateTime> Birthday get; set;
myObject.Birthday = new DateTime(1986, 7, 2); // <- Works
myObject.Birthday.ToShortDateString(); // <- Compiler-Error !
myObject.Birthday.Value.ToShortDateString(); // <- Works
如果 DateTime 可以为空,我需要另一个方法调用
public AnnotationField<DateTime?> Birthday get; set;
myObject.Birthday.Value.Value.ToShortDateString(); // <- Works but is not really usable!
【问题讨论】:
我不认为你可以做你想做的事,至少不能不使用反射和失去类型安全。对于你可以继承的 T 来说,显然是可行的。虽然对结构没有帮助。 或者,如果你不关心类型安全和智能感知的优点,你可以使用动态类型。 【参考方案1】:在AnnotationField<DateTime?>
上添加extension method 类型:
public static class Extensions
public static string ToShortDateString(this AnnotationField<DateTime?> item)
return item.Value.Value.ToShortDateString();
有了这个,你就可以打电话了:
public AnnotationField<DateTime?> Birthday get; set;
myObject.Birthday.ToShortDateString();
【讨论】:
我认为这个想法是 OP 不想手动添加这些类型的方法,他想隐式继承它们。 抱歉,我不想将所有方法都添加为扩展。这不是我在泛型类背后的想法 所以我不得不说,你没有正确使用泛型。当所有类型都有共同点(例如实现相同的接口)时,泛型才有意义。否则你的功能根本不是通用的。 @MarcinJuraszek 对于泛型的使用,这是一个相当受限的观点,关键是无论实现如何都允许类型安全。就我个人而言,我认为这种方法没有任何问题,它实际上是一个提供特定数据类型上下文的容器。【参考方案2】:据我所知,没有办法做到这一点。问题是编译器看到的是在 AnnotationField<DateTime>
而不是 DateTime
上调用的 ToShortDateString
方法,因为隐含的东西只发生在运行时,而不是编译时。
如果struct
支持继承,您可以从DateTime
派生,但是,您可以实现这一点的唯一方法是从AnnotationField<DateTime>
派生并引入这些方法并委托调用或更抽象的方法是使用扩展方法(如前所述)。
【讨论】:
以上是关于DateTime 等类型的隐式运算符,没有 ToShortDateString() 等日期时间函数的主要内容,如果未能解决你的问题,请参考以下文章
数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。