【问题标题】:Trim and return any type修剪并返回任何类型
【发布时间】:2016-12-01 15:04:59
【问题描述】:

我已经开发了这个基本方法,我希望它能够修剪并返回任何类型:

public static object TrimValue<T>(T arg, int MaxLength)
{
    var val = arg.ToString();

    var trimVal = val.Substring(0, MaxLength);

    return Convert.ChangeType(trimVal, arg.GetType());
}

用途:

    double aDouble = 1000;

    double cDouble = TrimValue(aDouble, 2);

不幸的是我得到了错误:

无法将类型“object”隐式转换为“double”

演员表会起作用,但我可能会修剪 Double、String 或 Int,这样就不起作用了。有谁知道如何修剪通用值?

谢谢

【问题讨论】:

  • “将双精度数修剪为 2”是什么意思?这意味着它将1000 更改为10TrimValue(new DateTime(2016,12,1),3) 会返回什么?修剪如何应用于除字符串之外的任何内容?
  • @DanHall 那么为什么返回类型不是string 或者你为什么没有将返回类型设置为T
  • MaxLength 大于val 字符串的长度时,您也会遇到问题。
  • 我希望你不希望将它用于 String[] 或 List。甚至是一个布尔...
  • 但是“修剪”一个数字是没有意义的,因为它会改变值。如果客户想要发送一个太大的数字,那么隐式“修剪”它会发送一个不同的值。另外,尝试将“修剪过的”字符串表示更改回原始类型似乎非常脆弱。 “1.2E3”是一个有效的double 字符串,但“1.2E”不是。 “2016-12-01”是有效的日期字符串,但“2016-0”不是。也许您已经采取了其他保护措施来防止这种情况发生,但从表面上看,这似乎很奇怪。

标签: c# generics type-conversion


【解决方案1】:

你的返回类型不正确,而不是返回object,改为返回调用者使用T传递的特定泛型类型:

public static T TrimValue<T>(T arg, int MaxLength)
{
    var val = arg.ToString();

    var trimVal = val.Substring(0, MaxLength);

    return (T)Convert.ChangeType(trimVal, arg.GetType());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多