从字符串返回多种类型之一

本文关键字:类型 种类 字符串 返回 | 更新日期: 2023-09-27 18:06:38

我有一个通用的方法。

private T Blah<T>()

在这个方法中,我有一个我想返回的字符串,但问题是T可能不是字符串。T取值为:stringintDateTimeDateTime?decimal?

我该如何处理这个字符串才能返回它并支持所有这些类型?

从字符串返回多种类型之一

  private T Blah<T> () where T : IConvertible
  {            
     if (!String.IsNullOrEmpty(source))
          return (T)Convert.ChangeType(source, typeof(T));
     return default(T);
  }

应该适用于所有类型

这可能有帮助:

private T Blah<T>(Func<string, T> map)
{   
    //Your codes here
    return map(yourString); //yourString: the string which you are going to convert
}

这里你叫它:

//For int
Blah(input => int.Parse(input));
//For DateTime
Blah(input => DateTime.Parse(input));

我将Blah<T> 设置为public用于测试,请根据您的要求进行修改。

  • 代码
    partial class SomeClass {
        public T Blah<T>() {
            var t="2013 03 30";
            return (T)(typeof(String).Equals(typeof(T))?t as object:(
                from args in new[] { new object[] { t, default(T) } }
                let type=Nullable.GetUnderlyingType(typeof(T))??typeof(T)
                let types=new[] { typeof(String), type.MakeByRefType() }
                let bindingAttr=BindingFlags.Public|BindingFlags.Static
                let tryParse=type.GetMethod("TryParse", bindingAttr, default(Binder), types, null)
                let b=typeof(DateTime)!=type
                let dummy=b?args[0]=((String)args[0]).Split(''x20').Aggregate(String.Concat):""
                let success=null!=tryParse?tryParse.Invoke(typeof(T), args):false
                select args.Last()).Last());
        }
    }
    

    partial class TestClass {
        public static void TestMethod() {
            var x=new SomeClass();
            Console.WriteLine("x.Blah<String>() = {0}", x.Blah<String>());
            Console.WriteLine("x.Blah<int>() = {0}", x.Blah<int>());
            Console.WriteLine("x.Blah<DateTime>() = {0}", x.Blah<DateTime>());
            Console.WriteLine("x.Blah<DateTime?>() = {0}", x.Blah<DateTime?>());
            Console.WriteLine("x.Blah<decimal?>() = {0}", x.Blah<decimal?>());
        }
    }
    
  • 输出<>之前x.Blah() = 2013 03 30x.Blah() = 20130330x.Blah() = 2013/3/30 0:00:00x.Blah<DateTime?>() = 2013/3/30 0:00:00x.Blah<decimal?>() = 20130330

特殊的是,如果目标类型不是DateTimeDateTime?,我删除了空格。

你甚至可以尝试x.Blah<long>(),这不是你的要求,和任何其他类型。如果您发现任何类型都可能导致异常,请告诉我。