【问题标题】:Converto a String Into a T type C#将字符串转换为 T 类型 C#
【发布时间】:2017-06-10 10:41:56
【问题描述】:

我想创建一个函数,输入一个字符串,并根据 T 类型返回转换后的字符串。

我试过了

static T convertStringTemplate<T>(string myString)
        {
            return T.Parse(myString);
        }

但是它不起作用。你有什么想法吗?

【问题讨论】:

  • T 是什么类型?
  • T 可以是任何数字类型(int、float、double、...)

标签: c# string templates type-conversion


【解决方案1】:

泛型不是那样工作的。对于任何匹配约束的T,泛型必须是可实例化的(在您的情况下没有限制)。 convertStringTemplate&lt;object&gt; 是一个简单的例子,但显然不会起作用。

您在评论中写道:

T 可以是任何数值类型(int、float、double、...)

如果它只适用于数字类型,那么它就简单多了。只需拨打Convert.ChangeType

【讨论】:

  • 我尝试使用return Convert.ChangeType(myString, typeof(T));,但是 typeof 无法识别 T
  • @GVa 要么您误读了错误消息(Convert.ChangeType 返回 object,然后您可以将其转换为 T,但如果这是问题所在,则与 typeof 无关),或者您没有将其放入具有名为 T 的泛型类型参数的泛型方法中。
【解决方案2】:

一个简单的方法是使用IConvertible 接口:

static T ConvertStringTemplate<T>(string myString, IFormatProvider formatProvider = null)
{
    formatProvider = formatProvider ?? System.Globalization.CultureInfo.CurrentCulture;
    return (T)((IConvertible)myString).ToType(typeof(T), formatProvider);
}

如果您想将T 限制为数字类型,您可以使用的最接近的约束是以下一个(来自this answer):

static T ConvertStringTemplate<T>(string myString, IFormatProvider formatProvider = null)
    where T :
        struct, 
        IComparable, 
        IComparable<T>, 
        IConvertible, 
        IEquatable<T>, 
        IFormattable
{
    formatProvider = formatProvider ?? System.Globalization.CultureInfo.CurrentCulture;
    return (T)((IConvertible)myString).ToType(typeof(T), formatProvider);
}

用法:

var x = ConvertStringTemplate<int>("12"); // results in 12

[编辑]
如 cmets 中所述,您可能希望在转换字符串时使用当前区域性,因此我在该方法中添加了一个 IFormatProvider 自定义参数。

【讨论】:

  • 嘿,IConvertible 接口正是Convert.ChangeType(我在回答中建议)最终会使用的接口。您可能希望避免使用InvariantCulture。 OP 尝试调用 T.Parse,如果它有效,它将执行文化敏感解析。
  • @hvd 不知道Convert.ChangeType 在内部使用了IConvertible 接口。感谢您的澄清。
  • 这会在运行时爆炸。
  • @KennethK。应该炸什么? DotNetFiddle here
【解决方案3】:

使用命名程序集和默认构造函数创建指定名称的类型的实例,可以使用Activator.CreateInstance Method (String, String) 完成

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多