在运行时分配类型

时间:2011-02-10 11:36:02

标签: c# reflection

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

bool x, value = "True"
int x, value = "1"
  • 是否有通用方法将值分配/解析/反序列化为x?

注意可以引用T或原始类型!

3 个答案:

答案 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)

我前段时间写过这种基于反射的方法。虽然这是相对未经测试的。它寻找名为ParseTryParse的方法。而且我没有处理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”是枚举值,还是颜色对象或字符串。

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