Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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,我试图用c#编写一个泛型函数,它试图根据类型解析字符串 这是我试过的 public static T convertString<T>(string raw) { if( typeof(T) == DateTime ){ DateTime final; DateTime.TryParseExact(raw, "yyyy-mm-dd hh:mm:ss", CultureInfo.InvariantCultu

我试图用c#编写一个泛型函数,它试图根据类型解析字符串

这是我试过的

    public static T convertString<T>(string raw)
    {
        if( typeof(T) == DateTime ){
            DateTime final;
            DateTime.TryParseExact(raw, "yyyy-mm-dd hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out final);
            return final;
         }

        if( typeof(T) == int ){
            int final;
            Int32.TryParse(raw, out final);
            return final;
        }

    }
publicstatict转换器字符串(字符串原始)
{
if(typeof(T)=日期时间){
最终日期时间;
DateTime.TryParseExact(原始,“yyyy-mm-dd hh:mm:ss”,CultureInfo.InvariantCulture,DateTimeStyles.None,out-final);
返回最终结果;
}
if(类型(T)==int){
int最终版本;
Int32.胰蛋白酶(生的,最终的);
返回最终结果;
}
}

如何更正此函数以使其正常工作?

您可以尝试以下操作:

public static T ConvertFromString<T>(string raw)
{
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(raw);
}

// Usage
var date = ConvertFromString<DateTime>("2015/01/01");
var number = ConvertFromString<int>("2015");
publicstatict ConvertFromString(字符串原始)
{
返回(T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(原始);
}
//用法
var日期=ConvertFromString(“2015/01/01”);
风险值编号=ConvertFromString(“2015”);
编辑:支持TryConvert

否则,您可以创建一个函数,尝试转换输入字符串:

public static bool TryConvertFromString<T>(string raw, out T result)
{
    result = default(T);
    var converter = TypeDescriptor.GetConverter(typeof (T));
    if (!converter.IsValid(raw)) return false;

    result = (T)converter.ConvertFromString(raw);
    return true;
}

// Usage
DateTime result;
if (!TryConvertFromString<DateTime>("this is not a date", out result))
{

}
公共静态bool TryConvertFromString(字符串原始,输出结果)
{
结果=默认值(T);
var converter=TypeDescriptor.GetConverter(typeof(T));
如果(!converter.IsValid(raw))返回false;
结果=(T)converter.ConvertFromString(原始);
返回true;
}
//用法
日期时间结果;
如果(!TryConvertFromString(“这不是日期”,输出结果))
{
}

如果类型U实现IConvertible,您甚至可以更通用地执行此操作,而不依赖字符串参数-这意味着您必须指定两个类型参数:

 public static T ConvertValue<T,U>(U value) where U : IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    }
public static T ConvertValue(U值),其中U:IConvertible
{
return(T)Convert.ChangeType(value,typeof(T));
}

泛型根据
T
的类型具有非常不同的实现,通常没有意义。你可以调用
convertString
,而你的方法不知道如何处理它。@EricJ。你能给我举个例子吗?@MikeA什么的例子?@Servy如何使用
convertString
语法
泛型实际上应该是泛型的,并且在任何可能的类型上都是一样的
你能解释一下它是如何工作的吗?这将如何解析datetime或int?@MikeA,我已经更新了我的帖子。您需要解释泛型类型在一般情况下是如何工作的吗?谢谢。如果我执行这个
convertString(“Mike A”)
这会给我一个错误还是返回一个不正确的值?@MikeA,我添加了一个新版本的函数来支持TryConvert。如果答案对你合适,请将其标记为有效。我想你需要检查你是否可以在之前将U转换为T?