【问题标题】:Converting object with explicit conversions to generic method type T将具有显式转换的对象转换为泛型方法类型 T
【发布时间】:2019-06-11 13:51:42
【问题描述】:

我有 AClass,其中包含方法形式的显式转换:

public static explicit operator Double(AClass x)

对于所有原始类型:int、string等。类不实现IConvertible接口。

在此限制之上,我正在制作具有以下签名的通用方法:

private void VerifyBla<T>(string abc, T expected)

AClass 基本上是围绕原始类型的包装器,在这种方法中,我想将 AClass 转换为 T 并验证它的值。

我尝试过使用:

(T)aClass

但智能感知:无法将类型“AClass”转换为 T。

是否有任何变通方法来解决这个问题,只需对 AClass 进行最小更改或不更改?

我尝试过使用:

(T)Convert.ChangeType(myobject, typeof(T));

但它失败了,因为 AClass 没有实现 IConvertible。如果我要实现它,我猜我需要实现很多方法。

【问题讨论】:

  • 您的包装器是否包含 T 类型的值字段?
  • "AClass 没有实现 IConvertible。如果我要实现它,我猜我需要实现很多方法。" -- 是的,但是您已经完成了弄清楚如何将AClass 的实例转换为不同类型的“艰苦”工作。所以你基本上只是从接口方法中调用这些静态运算符。这听起来像是实现IConvertible 的主要示例。
  • 由于T 没有通用约束,它可以是任何东西,包括MyClass。当然,您不能将 AClass 转换为 MyClass,因为它们没有任何共同的继承关系。
  • 从技术上讲,(T)(dynamic)aClass 应该可以工作(请参阅stackoverflow.com/q/16395840/87698),但这并不漂亮。

标签: c# type-conversion


【解决方案1】:

如果您不想实现完整的 IConvertible 接口,那么只对您拥有的少数实例进行类型模式匹配可能是有意义的:

switch (expected)
{
    case Double dbl: return dbl == (Double)aClass;
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多