MoMA является большим инструментом для этого, как кто-то еще предположил. Самые большие источники несовместимости в эти дни являются приложениями который DllImport (или P/Invoke) в библиотеки Win32. Некоторые блоки не реализованы, но большинство из них только для Windows и действительно не имело бы смысла на Linux. Я думаю, что довольно безопасно сказать, что большинство приложений ASP.NET может работать Моно с ограниченными модификациями.
(Раскрытие: я способствовал самому Моно, а также записанным приложениям, которые работают сверху его.)
void SetValue(PropertyInfo info, object instance, object value)
{
info.SetValue(instance, Convert.ChangeType(value, info.PropertyType));
}
Ответ Томаса правильный, но я подумал, что добавлю свой вывод о том, что Convert.ChangeType не обрабатывает преобразование в типы, допускающие значение NULL. Для обработки типов, допускающих значение NULL, я использовал следующий код:
void SetValue(PropertyInfo info, object instance, object value)
{
var targetType = info.PropertyType.IsNullableType()
? Nullable.GetUnderlyingType(info.PropertyType)
: info.PropertyType;
var convertedValue = Convert.ChangeType(value, targetType);
info.SetValue(instance, convertedValue, null);
}
В этом коде используется следующий метод расширения:
public static class TypeExtensions
{
public static bool IsNullableType(this Type type)
{
return type.IsGenericType
&& type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
}