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&lt;DateTime?&gt; 上添加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&lt;DateTime&gt; 而不是 DateTime 上调用的 ToShortDateString 方法,因为隐含的东西只发生在运行时,而不是编译时。

如果struct 支持继承,您可以从DateTime 派生,但是,您可以实现这一点的唯一方法是从AnnotationField&lt;DateTime&gt; 派生并引入这些方法并委托调用或更抽象的方法是使用扩展方法(如前所述)。

【讨论】:

以上是关于DateTime 等类型的隐式运算符,没有 ToShortDateString() 等日期时间函数的主要内容,如果未能解决你的问题,请参考以下文章

数据库界面修改时,出现不允许从数据类型 datetime 到 int 的隐式转换.请使用 CONVERT 函数来运行此查询。

JavaScript数据类型的隐式转换

为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]

js中的隐式类型转化

使用接口的隐式运算符

关系运算符中的隐式转换