【问题标题】:C# Dynamically parse user input to string, int, double, decimal, datetime, bool, etc [duplicate]C#将用户输入动态解析为字符串、int、double、decimal、datetime、bool等[重复]
【发布时间】:2015-07-04 07:28:50
【问题描述】:

如何将用户输入的值动态解析为某种类型?

如果我有一个文本框,用户可以在其中输入他们想要的任何内容,我如何动态解析该值并返回适当的类型?

 public dynamic ParseValue(dynamic value)
 {
     return //TO DO
 }

如果用户输入以下值:

  • 06.18.2015 10:23:00 // 返回日期时间
  • 一些文本 // 返回字符串
  • 10.23 //返回双精度/十进制
  • true/True/false/False // 返回布尔值而不是字符串
  • 10 //返回整数

使用 type.TryParse 的方法是否正确,并检查每种类型是否有效?当然,我必须先检查它是否为 bool,然后是 string,否则如果值为 true/True/false/False,将导致 string 而不是 bool。

【问题讨论】:

标签: c#


【解决方案1】:

您不需要使用dynamic 关键字。因为您的源值始终是string

最好编写泛型方法来解析来自string 的值。 可以使用TypeDescriptor类的TypeConverter方法来编写这种方法。

来自this的回答

public static T Convert<T>(this string input)
{
    var converter = TypeDescriptor.GetConverter(typeof(T));
    if(converter != null)
    {
        //Cast ConvertFromString(string text) : object to (T)
        return (T)converter.ConvertFromString(input);
    }
    return default(T);
}

【讨论】:

  • 你应该标记问题重复而不是复制/粘贴...
  • @NamBình 抱歉,由于提到了dynamic 关键字,我认为这个问题有所不同。
【解决方案2】:

虽然我不明白你为什么需要这个,但以下可能会起作用:

   // since user will enter text value should be string
    public dynamic ParseValue(string value)
    {
        DateTime tempDateTime;
        if (DateTime.TryParse(value, out tempDateTime))
        {
            return tempDateTime;
        }

        int tempInt;
        if(int.TryParse(value, out tempInt))
        {
            return tempInt;
        }

        // also process other types like double etc. before falling back to string
        return value;
    }
}

但我怀疑这将是一个解决方案,因为您需要获取确切的类型来处理调用函数中的返回值。

【讨论】:

    【解决方案3】:

    是的,恕我直言,您需要使用 type.TryParse 并为类型优先级构建自己的逻辑

    Generic TryParse

    public dynamic ParseValue(string value)
     {
         return //TO DO
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2011-05-25
      • 2014-07-23
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多