在运行时分配类型
我有一个类型为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的方法。 虽然这是相对未经测试的。 它寻找称为Parse
和TryParse
方法。 我也没有处理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对象还是串。
您可以使用XmlSerializer
或BinaryFormatter
来序列化/反序列化您的对象,这已经为您完成了所有这些逻辑。
上述就是C#学习教程:在运行时分配类型分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987592.html