Я хотел бы привести с использованием типа времени выполнения, но я застрял со следующим исключением;
Exception has occurred: CLR/System.InvalidCastException
An unhandled exception of type 'System.InvalidCastException' occurred in System.Private.CoreLib.dll: 'Object must implement IConvertible.'
var myObject1 = new string[]{"str1", "str2"};
// here it's an string[], but it could be any other kind of data.
var myObject2 = new int[]{1, 2};
var myObject3 = new X ... ; //
var runtimeType1 = typeof(LiteralType1);
var runtimeType2 = typeof(LiteralType2);
var runtimeType3 = typeof(LiteralType3);
// I test/know I have a compatible runtime type. If now I'd have a try/cast.
var test1 = (LiteralType1)myObject1; // cast is ok!
var test2 = (LiteralType2)myObject2; // cast is ok!
var test3 = (LiteralType3)myObject3; // cast is ok!
var test2_1 = Convert.ChangeType(myObject1, runtimeType1);
// exception is thrown here.
var test2_2 = Convert.ChangeType(myObject2, runtimeType2);
// exception is thrown here.
var test2_3 = Convert.ChangeType(myObject3, runtimeType3);
// exception is thrown here.
Тип Generi c здесь не вариант, только тип времени выполнения. Эти типы времени выполнения получены посредством отражения и являются правильными и совместимыми типами. Кажется, единственной проблемой является исключение IConvertible.
РЕДАКТИРОВАТЬ
Я думаю, что нашел решение, но пока не уверен, насколько оно solid. Для этого может понадобиться попытка / ловить,
public static dynamic Cast(dynamic toConvert, Type type) {
dynamic dummy = Activator.CreateInstance(type);
// might throw exceptions for some types ...
// Dummy is only a mean to infer a generic type from a runtime type
return Convert(toConvert, dummy);
}
public static T Convert<T>(dynamic toConvert, T dummy) {
return (T)toConvert;
// might throw exceptions
}
Кто-нибудь нашел более элегантное или более надежное решение? Я действительно хотел бы знать, если вы делаете; Тип исполнения / преобразование во время исполнения всегда были одними из моих главных любимых мозолей.