【问题标题】:c# Type parameters : How to Parse?c#类型参数:如何解析?
【发布时间】:2013-06-24 10:55:42
【问题描述】:
public static T Process<T>(this string key)
        where T:bool,string, DateTime
    {
        var tType = typeof(T);

        if(tType == typeof(DateTime))
        {
            return DateTime.Parse(key.InnerProcess());
        }
        else if(tType == typeof(bool))
        {
            return bool.Parse(key.InnerProcess());
        }
        else if(tType == typeof(string))
        {
            return key.InnerProcess();
        }
    }

它说它不能从 bool 类型转换为 T,或 datetime 到 T.. 如何做到这一点?

innerPrecess() 给了我一个字符串。我想将其解析为给定参数的类型,然后返回。

【问题讨论】:

  • 您的类型参数约束无论如何都不起作用。 T 需要是它们的all。不幸的是,这在这里是相互排斥的。
  • 你的约束都不是有效的:如果你指定一个类型作为约束,它必须要么是一个接口,要么是一个未密封的类。 boolDateTime 是结构体,string 是密封类。

标签: c# asp.net oop c#-4.0 c#-3.0


【解决方案1】:

您可以使用Convert.ChangeType 更简单:

public static T Process<T>( string key) where T: IConvertible
{
    return (T)Convert.ChangeType(key.InnerProcess(), typeof (T));
}

【讨论】:

  • +1,这适用于实现System.IConvertible的任何类型T。
  • 请注意,需要实现IConvertible的不是T,而是ChangeType()的第一个参数。这将始终是 string(并且确实实现了接口。)实际上,T 必须是 IConvertible 为其提供转换的类型,尽管没有明确的方法可以将其置于约束中。跨度>
【解决方案2】:

编译器不会尝试理解代码来证明您返回的内容T。不幸的是,唯一的方法是添加一个框/取消框(对于值类型,而不是字符串):

return (T)(object)DateTime.Parse(...etc...);

就个人而言,我建议只使用单独的非泛型方法,除非这里有充分的理由使用泛型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多