Csharp/C#教程:在运行时分配类型分享


在运行时分配类型

我有一个类型为T的变量x和一个字符串中的值。 例如我有:

bool x, value = "True" int x, value = "1" 

请注意,T可能被引用或原始类型!

您可以使用Convert.ChangeType方法 。

这将涵盖所有基本类型转换。

示例: var i = Convert.ChangeType("1", typeof(int));

您还可以查看IConvertible接口 ,您可以使用该接口将自己的对象转换为另一种类型。

最后,正如codymanix所说,您可以依靠OOB XmlSerialization或二进制序列化来序列化您的对象。

[edit]你可以在编译时检查目标类型是否可以转换,方法是将convert.ChangeType方法包装在如下的实用程序类中:

 public static class ConvertUtility { public static T Convert(object source) where T : IConvertible { return (T)System.Convert.ChangeType(source, typeof(T)); } } 

我不久前写过这种基于reflection的方法。 虽然这是相对未经测试的。 它寻找称为ParseTryParse方法。 我也没有处理locale(in)依赖解析。

  private static class ParseDelegateStore { public static ParseDelegate Parse; public static TryParseDelegate TryParse; } private delegate T ParseDelegate(string s); private delegate bool TryParseDelegate(string s, out T result); public static T Parse(string s) { ParseDelegate parse = ParseDelegateStore.Parse; if (parse == null) { parse = (ParseDelegate)Delegate.CreateDelegate(typeof(ParseDelegate), typeof(T), "Parse", true); ParseDelegateStore.Parse = parse; } return parse(s); } public static bool TryParse(string s, out T result) { TryParseDelegate tryParse = ParseDelegateStore.TryParse; if (tryParse == null) { tryParse = (TryParseDelegate)Delegate.CreateDelegate(typeof(TryParseDelegate), typeof(T), "TryParse", true); ParseDelegateStore.TryParse = tryParse; } return tryParse(s, out result); } 

我知道其他方式而不是:

 object x; if (theType==typeof(int)) x = int.parse(myString); else if (theType==typeof(bool)) x = bool.Parse(myString); // and so on for other types.. 

另请注意,序列化数据必须包含类型名称,因为否则您无法知道“123”是int类型还是unsigned short类型,或者例如“Red”是枚举值,Color对象还是串。

您可以使用XmlSerializerBinaryFormatter来序列化/反序列化您的对象,这已经为您完成了所有这些逻辑。

上述就是C#学习教程:在运行时分配类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/987592.html

(0)
上一篇 2021年12月23日
下一篇 2021年12月23日

精彩推荐