我有一个类型为T的变量x和一个字符串中的值。 例如,我有:
bool x, value = "True"
int x, value = "1"
注意可以引用T或原始类型!
答案 0 :(得分:5)
您可以使用Convert.ChangeType
method。
这将涵盖所有基类型转换。
示例:var i = Convert.ChangeType("1", typeof(int));
您还可以查看可用于将自己的对象转换为其他类型的IConvertible
interface。
最后,正如codymanix所说,你可以依靠OOB XmlSerialization或二进制序列化来序列化你的对象。
[edit]您可以在编译时检查目标类型是否可转换,方法是将convert.ChangeType方法包装在如下的实用程序类中:
public static class ConvertUtility
{
public static T Convert<T>(object source) where T : IConvertible
{
return (T)System.Convert.ChangeType(source, typeof(T));
}
}
答案 1 :(得分:1)
我前段时间写过这种基于反射的方法。虽然这是相对未经测试的。它寻找名为Parse
和TryParse
的方法。而且我没有处理locale(in)依赖解析。
private static class ParseDelegateStore<T>
{
public static ParseDelegate<T> Parse;
public static TryParseDelegate<T> TryParse;
}
private delegate T ParseDelegate<T>(string s);
private delegate bool TryParseDelegate<T>(string s, out T result);
public static T Parse<T>(string s)
{
ParseDelegate<T> parse = ParseDelegateStore<T>.Parse;
if (parse == null)
{
parse = (ParseDelegate<T>)Delegate.CreateDelegate(typeof(ParseDelegate<T>), typeof(T), "Parse", true);
ParseDelegateStore<T>.Parse = parse;
}
return parse(s);
}
public static bool TryParse<T>(string s, out T result)
{
TryParseDelegate<T> tryParse = ParseDelegateStore<T>.TryParse;
if (tryParse == null)
{
tryParse = (TryParseDelegate<T>)Delegate.CreateDelegate(typeof(TryParseDelegate<T>), typeof(T), "TryParse", true);
ParseDelegateStore<T>.TryParse = tryParse;
}
return tryParse(s, out result);
}
答案 2 :(得分:0)
我知道其他方式而不是:
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”是枚举值,还是颜色对象或字符串。
您可以使用XmlSerializer
或BinaryFormatter
来序列化/反序列化您的对象,这已经为您完成了所有这些逻辑。