C# 从字符串返回多种类型之一
我有一个通用的方法C# 从字符串返回多种类型之一,c#,generics,C#,Generics,我有一个通用的方法 private T Blah<T>() private T Blah() 在这个方法中,我有一个要返回的字符串,但问题是T可能不是字符串。值T可以是string、int、DateTime、DateTime?和decimal? 如何处理这个字符串,以便返回它并支持所有这些类型?private T Blah(),其中T:IConvertible private T Blah<T> () where T : IConvertible {
private T Blah<T>()
private T Blah()
在这个方法中,我有一个要返回的字符串,但问题是T
可能不是字符串。值T
可以是string
、int
、DateTime
、DateTime?
和decimal?
如何处理这个字符串,以便返回它并支持所有这些类型?private T Blah(),其中T:IConvertible
private T Blah<T> () where T : IConvertible
{
if (!String.IsNullOrEmpty(source))
return (T)Convert.ChangeType(source, typeof(T));
return default(T);
}
{
如果(!String.IsNullOrEmpty(源))
return(T)Convert.ChangeType(source,typeof(T));
返回默认值(T);
}
应该适用于所有这些类型。private T Blah(),其中T:IConvertible
{
如果(!String.IsNullOrEmpty(源))
return(T)Convert.ChangeType(source,typeof(T));
返回默认值(T);
}
应适用于所有这些类型。这可能有助于:
private T Blah<T>(Func<string, T> map)
{
//Your codes here
return map(yourString); //yourString: the string which you are going to convert
}
这可能有助于:
private T Blah<T>(Func<string, T> map)
{
//Your codes here
return map(yourString); //yourString: the string which you are going to convert
}
我将Blah
公开测试,根据您的要求进行修改
- 代码
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()); } }
部分类SomeClass{ 公共T布拉(){ var t=“2013 03 30”; 返回(T)(typeof(String).等于(typeof(T))?T作为对象:( 来自新[]{new object[]{t,默认值(t)} let type=Nullable.GetUnderlyingType(typeof(T))??typeof(T) 让types=new[]{typeof(String),type.MakeByRefType()} 让bindingAttr=BindingFlags.Public | BindingFlags.Static 让tryParse=type.GetMethod(“tryParse”,bindingAttr,默认值(绑定器),类型,null) 设b=typeof(DateTime)!=type 让dummy=b?args[0]=((字符串)args[0]).Split('\x20').Aggregate(String.Concat):“” 让success=null!=tryParse?tryParse.Invoke(typeof(T),args):false 选择args.Last()).Last(); } }
部分类TestClass{ 公共静态void TestMethod(){ var x=新的SomeClass(); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); } }
- 输出 x.Blah<String>() = 2013 03 30 x.Blah<int>() = 20130330 x.Blah<DateTime>() = 2013/3/30 0:00:00 x.Blah<DateTime?>() = 2013/3/30 0:00:00 x.Blah<decimal?>() = 20130330 x、 Blah()=2013 03 30 x、 Blah()=20130330 x、 Blah()=2013/3/30 0:00:00 x、 Blah()=2013/3/30 0:00:00 x、 Blah()=20130330
DateTime
或DateTime?
,我就删除了空格
您甚至可以尝试使用您不需要的x.Blah()
,以及任何其他类型。如果发现任何类型的都可能导致异常,请告诉我 我将Blah
公开用于测试,根据您的要求进行修改
- 代码
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()); } }
部分类SomeClass{ 公共T布拉(){ var t=“2013 03 30”; 返回(T)(typeof(String).等于(typeof(T))?T作为对象:( 来自新[]{new object[]{t,默认值(t)} let type=Nullable.GetUnderlyingType(typeof(T))??typeof(T) 让types=new[]{typeof(String),type.MakeByRefType()} 让bindingAttr=BindingFlags.Public | BindingFlags.Static 让tryParse=type.GetMethod(“tryParse”,bindingAttr,默认值(绑定器),类型,null) 设b=typeof(DateTime)!=type 让dummy=b?args[0]=((字符串)args[0]).Split('\x20').Aggregate(String.Concat):“” 让success=null!=tryParse?tryParse.Invoke(typeof(T),args):false 选择args.Last()).Last(); } }
部分类TestClass{ 公共静态void TestMethod(){ var x=新的SomeClass(); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); WriteLine(“x.Blah()={0}”,x.Blah()); } }
- 输出 x.Blah<String>() = 2013 03 30 x.Blah<int>() = 20130330 x.Blah<DateTime>() = 2013/3/30 0:00:00 x.Blah<DateTime?>() = 2013/3/30 0:00:00 x.Blah<decimal?>() = 20130330 x、 Blah()=2013 03 30 x、 Blah()=20130330 x、 Blah()=2013/3/30 0:00:00 x、 Blah()=2013/3/30 0:00:00 x、 Blah()=20130330
DateTime
或DateTime?
,我就删除了空格
您甚至可以尝试使用您不需要的
x.Blah()
,以及任何其他类型。如果发现任何类型的都可能导致异常,请告诉我 当您知道泛型类型总是返回字符串时,它的目标是什么?不,我的意思是,在代码中我有一个要返回的字符串。如果T是DateTime,那么我想将该字符串转换为DateTime并返回它,如果它是一个十进制,那么我想协调到decimal并返回它,等等。当您知道泛型类型总是返回字符串时,它的目标是什么?不,我的意思是,在代码中我有一个要返回的字符串。如果T是DateTime,那么我想将该字符串转换为DateTime并返回它,如果它是十进制,那么我想协调到十进制并返回它等等。然后使用convert并要求T实现IConvertable。。。我将为您更新我的答案=)@SachinKainth,定义优雅。@Anthony这是在我的答案优雅=)之前,然后使用Convert并要求T实现IConvertable。。。我会为你更新我的答案=)@SachinKainth,define grateent.@Anthony那是在我的答案是grateent=)之前