Время выполнения и исключение IConvertible - PullRequest
0 голосов
/ 02 мая 2020

Я хотел бы привести с использованием типа времени выполнения, но я застрял со следующим исключением;

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 
}

Кто-нибудь нашел более элегантное или более надежное решение? Я действительно хотел бы знать, если вы делаете; Тип исполнения / преобразование во время исполнения всегда были одними из моих главных любимых мозолей.

...