Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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#_.net_Generics - Fatal编程技术网

C# 如何生成泛型类型转换函数

C# 如何生成泛型类型转换函数,c#,.net,generics,C#,.net,Generics,可能重复: 我想创建一个通用函数来执行一些操作,例如: ConvertValue<T>(string value) ConvertValue(字符串值) 如果T为int,则函数将值转换为int,并返回结果 类似地,如果T是boolean,函数将值转换为boolean,并返回它 怎么写这个?像这样的东西 public static T ConvertValue<T>(string value) { return (T)Convert.ChangeType(va

可能重复:

我想创建一个通用函数来执行一些操作,例如:

ConvertValue<T>(string value)
ConvertValue(字符串值)
如果
T
int
,则函数将值转换为
int
,并返回结果

类似地,如果
T
boolean
,函数将
转换为
boolean
,并返回它

怎么写这个?

像这样的东西

public static T ConvertValue<T>(string value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

我考虑捕获
Convert.ChangeType()
可能引发的
InvalidCastException
异常-但是在这种情况下,您会返回什么<代码>默认值(T)?让调用方处理异常似乎更合适。

ConvertValue(System.Object o),然后您可以通过o.GetType()结果分支并向上转换o到类型以处理该值。

虽然可能不像
IConvertible方法那样干净,您始终可以使用简单的检查
typeof(T)
返回
T

public static T ReturnType<T>(string stringValue)
{
    if (typeof(T) == typeof(int))
        return (T)(object)1;
    else if (typeof(T) == typeof(FooBar))
        return (T)(object)new FooBar(stringValue);
    else
        return default(T);
}

public class FooBar
{
    public FooBar(string something)
    {}
}
publicstatict返回类型(stringstringvalue)
{
if(typeof(T)=typeof(int))
返回(T)(对象)1;
否则如果(typeof(T)=typeof(FooBar))
返回(T)(对象)新FooBar(stringValue);
其他的
返回默认值(T);
}
公共级FooBar
{
公共FooBar(字符串)
{}
}

您看过Convert类吗?除非你需要一些特别的东西,否则再发明轮子是没有意义的。顺便说一句,这是一个转换而不是强制转换。强制转换会导致显式转换操作符被调用。我可以建议使用吗?OP特别要求使用genericswellydone。不过,只是一个用法说明:不要忘记对不受支持的转换执行异常处理。@Evan:请参阅我的更新-我认为调用方应该处理此异常,因为在转换方法中没有处理此异常的好方法-返回
default(t)
听起来不对。@BrokenGlass:我同意。在helper方法中没有干净的方法来处理它。如果我使用它,我会用
try-catch
块来包围调用。不要忘记,它不会处理值类型的null,例如,
ConvertValue(null)
爆炸,而
Convert.ToInt32(null)
将返回0。这可能是可取的,但请记住,这只是行为上的细微差别。另一个微妙的区别是,不严格需要约束到
IConvertible
,因为
Convert.ChangeType(new object(),typeof(object))
返回对象本身,即使
System.object
不是
IConvertible
,即如果输入和输出类型相同,然后,
IConvertible
-city不重要。如果强制转换失败,将引发FormatException,而不是InvalidCastException。如果您需要特定类型的专用逻辑,此技术非常有用
public static T ConvertValue<T,U>(U value) where U : IConvertible
{
    return (T)Convert.ChangeType(value, typeof(T));
}
public static T ReturnType<T>(string stringValue)
{
    if (typeof(T) == typeof(int))
        return (T)(object)1;
    else if (typeof(T) == typeof(FooBar))
        return (T)(object)new FooBar(stringValue);
    else
        return default(T);
}

public class FooBar
{
    public FooBar(string something)
    {}
}