从字符串返回多种类型之一
本文关键字:类型 种类 字符串 返回 | 更新日期: 2023-09-27 18:06:38
我有一个通用的方法。
private T Blah<T>()
在这个方法中,我有一个我想返回的字符串,但问题是T
可能不是字符串。T
取值为:string
、int
、DateTime
、DateTime?
、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
特殊的是,如果目标类型不是DateTime
或DateTime?
,我删除了空格。
你甚至可以尝试x.Blah<long>()
,这不是你的要求,和任何其他类型。如果您发现任何类型都可能导致异常,请告诉我。