Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串返回多种类型之一_C#_Generics - Fatal编程技术网

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=)之前