运行时如何将字符串对象转换为泛型对象?
问题:运行时将字符串转换为自定义泛型类失败
简化示例
我定义了一个支持从string直接转换的类:
public class MyClass { public static explicit operator MyClass(string stringValue) => new MyClass(); public static MyClass Parse(string value) => new MyClass(); }
编译时我可以通过(MyClass)"Some value"的方式将String转换为MyClass,但运行时执行转换操作时,会抛出错误:Invalid cast from 'System.String' to 'SomeNamespace.MyClass'。
我需要在运行时将字符串转换为泛型类,该如何解决这个问题?
已尝试的方法
我试过两种方式,但都报同样的错误:
- 使用
Convert.ChangeType:
var result = Convert.ChangeType("Parsable string", typeof(MyClass));
- 使用
TypeDescriptor转换器:
var converter = TypeDescriptor.GetConverter(typeof(MyClass)); var result = converter.ConvertFromString("Parsable string");
问题的核心在于:String类本身不知道如何将自己转换为未知类型,但这些未知类型都支持从String转换为自身(比如(UnknownClass)"Some string value"这种编译时转换是可行的)。
使用场景
这是一个运行时文本数据模型解析器,运行时我拿到外部API返回的IList<string>数据,需要将其转换为对应的领域对象。由于只有运行时才知道具体的对象类型,我无法硬编码具体类的实现。
以下是我的泛型函数实现,它需要把泛型对象的PropertyInfo和API返回值字符串组成的字典转换为泛型对象。我认为需要实现一个DoDirectCast(Type type, string value)方法,用来将字符串直接转换为指定类型,从而给泛型对象的属性赋值:
public T Transform<T>(Dictionary<PropertyInfo, string> arrOfPropOfT) { var returnObject = new T(); foreach (var keyValuePair in arrOfPropOfT) { Type propertyType = keyValuePair.value; string castableValue = keyValuePair.key; object? value = DoDirectCast(propertyType, castableValue); propertyInfo.SetValue(returnObject, value) } return returnObject; }
内容的提问来源于stack exchange,提问作者Alex Terkov
相关产品推荐
相关产品推荐

