C#:来自System.Type的动态解析

ctr*_*yan 47 .net c# type-conversion

我有一个Type,一个String和一个Object.

有没有什么方法可以调用parse方法或动态地在字符串上转换为该类型?

基本上我该如何删除此逻辑中的if语句

object value = new object();    
String myString = "something";
Type propType = p.PropertyType;

if(propType == Type.GetType("DateTime"))
{
    value = DateTime.Parse(myString);
}

if (propType == Type.GetType("int"))
{
    value = int.Parse(myString);
}
Run Code Online (Sandbox Code Playgroud)

并做更像这样的事情.

object value = new object();
String myString = "something";
Type propType = p.PropertyType;


//this doesn't actually work
value = propType .Parse(myString);  
Run Code Online (Sandbox Code Playgroud)

Ant*_*lev 80

TypeDescriptor 营救:

var converter = TypeDescriptor.GetConverter(propType);
var result = converter.ConvertFrom(myString);
Run Code Online (Sandbox Code Playgroud)

要集成到TypeConverter基础结构中,请TypeConverter使用它来实现您自己的和装饰类以进行转换TypeConverterAttribute

  • 你如何使用这个属性装饰DateTime,还是默认装饰? (2认同)

Tho*_*que 15

这适用于所有原始类型以及实现的类型 IConvertible

public static T ConvertTo<T>(object value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

编辑:实际上在你的情况下,你不能使用泛型(至少不容易).相反,你可以这样做:

object value = Convert.ChangeType(myString, propType);
Run Code Online (Sandbox Code Playgroud)


Ran*_*rck 7

我遇到了这个问题,这就是我解决它的方法:

value = myString;
var parse = propType.GetMethod("Parse", new[] { typeof(string) });
if (parse != null) {
  value = parse.Invoke(null, new object[] { value });
}
Run Code Online (Sandbox Code Playgroud)

......它对我有用.

总结一下,您试图在对象类型上找到一个静态"Parse"方法,该方法只接受一个字符串作为参数.如果找到这样的方法,则使用您尝试转换的字符串参数调用它.由于p是我的类型的PropertyInfo,我通过使用如下值设置我的实例来结束此方法:

p.SetValue(instance, value, null);
Run Code Online (Sandbox Code Playgroud)