【问题标题】:Determine type from given string input根据给定的字符串输入确定类型
【发布时间】:2011-04-30 14:01:34
【问题描述】:

有没有办法从给定的字符串输入中检测类型?

例如:

string input = "07/12/1999";

string DetectType( s ) { .... }

Type t = DetectType(input); // which would return me the matched datatype. i.e. "DateTime" in this case.

我必须从头开始写这个吗?
只是想在我开始之前检查是否有人知道更好的方法。

谢谢!

【问题讨论】:

  • 你需要自己写这个......让我想知道你为什么需要那个......

标签: c# .net string .net-4.0 types


【解决方案1】:

我很确定您必须从头开始编写此内容 - 部分原因是它将非常严格按照您的要求量身定制。即使是一个简单的问题,例如您给出的日期是 12 月 7 日还是 7 月 12 日,在这里都会产生很大的不同......以及您的日期格式是否严格,您需要支持哪些数字格式等。

我想我从来没有遇到过类似的事情——老实说,这种猜测通常会让我感到紧张。即使您知道数据类型,也很难正确解析,更不用说猜测数据类型的开头了:(

【讨论】:

  • 这是乔恩·斯基特爵士的谈话。
  • 好吧,我不得不同意.. 在我开始之前只是小心翼翼。我想现在我必须这样做。谢谢!
  • 我敢打赌你的单元测试和测试数据(你将非常需要)将是方法代码本身的 10 倍,哈哈 :)
【解决方案2】:

您必须对预期类型有所了解。 如果你这样做,你可以使用 TypeConverter 例如:

    public object DetectType(string stringValue)
    {
        var expectedTypes = new List<Type> {typeof (DateTime), typeof (int)};
        foreach (var type in expectedTypes)
        {
            TypeConverter converter = TypeDescriptor.GetConverter(type);
            if (converter.CanConvertFrom(typeof(string)))
            {
                try
                {
                    // You'll have to think about localization here
                    object newValue = converter.ConvertFromInvariantString(stringValue);
                    if (newValue != null)
                    {
                        return newValue;
                    }
                }
                catch 
                {
                    // Can't convert given string to this type
                    continue;
                }

            }  
        }

        return null;
    }

大多数系统类型都有自己的类型转换器,您可以使用类上的 TypeConverter 属性编写自己的类型转换器,并实现自己的转换器。

【讨论】:

  • 再次感谢,我确实部分使用了您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多