能否重写typeof()方法?自定义结构体需等效DateTime类型
结论:不可能让
typeof(test) == typeof(DateTime)返回true 在C#里,每个自定义类型(包括你定义的test结构体)都是独立的类型,typeof运算符返回的是对应类型的唯一System.Type实例。test和DateTime是完全不同的两个类型,它们的Type实例永远不会相等,这个需求从语言层面无法实现。
替代方案:让结构体表现得和
DateTime一样好用 如果你只是希望自定义结构体在使用体验上接近原生DateTime,可以通过以下方式实现:
- 实现隐式/显式转换,让结构体和
DateTime可以直接互相转换 - 重载常用运算符(比如比较、加减运算符)
- 重写
ToString、Equals、GetHashCode等基础方法 - 实现
DateTime相关的接口(比如IComparable<Test>、IFormattable)
修改后的示例代码:
private struct Test { private DateTime Value; public Test(DateTime value) { Value = value; } // 隐式转换:DateTime直接转Test public static implicit operator Test(DateTime value) { return new Test(value); } // 隐式转换:Test直接转DateTime public static implicit operator DateTime(Test test) { return test.Value; } // 重写ToString,和DateTime行为一致 public override string ToString() { return Value.ToString(); } // 重写Equals方法 public override bool Equals(object obj) { return obj is Test test && Value.Equals(test.Value); } // 重写GetHashCode public override int GetHashCode() { return Value.GetHashCode(); } // 重载相等判断运算符 public static bool operator ==(Test left, Test right) { return left.Equals(right); } public static bool operator !=(Test left, Test right) { return !(left == right); } // 重载比较运算符 public static bool operator <(Test left, Test right) { return left.Value < right.Value; } public static bool operator >(Test left, Test right) { return left.Value > right.Value; } // 实现IComparable接口支持排序 public int CompareTo(Test other) { return Value.CompareTo(other.Value); } }
这样修改后,你可以像使用DateTime一样使用这个结构体:
// 直接赋值DateTime给Test Test myTest = DateTime.Now; // 直接把Test转成DateTime DateTime date = myTest; // 直接比较大小 bool isEarlier = myTest < DateTime.Now.AddHours(1);
内容的提问来源于stack exchange,提问作者user23366103
相关产品推荐
相关产品推荐

