'кастинг' с отражением

MoMA является большим инструментом для этого, как кто-то еще предположил. Самые большие источники несовместимости в эти дни являются приложениями который DllImport (или P/Invoke) в библиотеки Win32. Некоторые блоки не реализованы, но большинство из них только для Windows и действительно не имело бы смысла на Linux. Я думаю, что довольно безопасно сказать, что большинство приложений ASP.NET может работать Моно с ограниченными модификациями.

(Раскрытие: я способствовал самому Моно, а также записанным приложениям, которые работают сверху его.)

76
задан jeroenh 9 September 2009 в 10:23
поделиться

2 ответа

void SetValue(PropertyInfo info, object instance, object value)
{
    info.SetValue(instance, Convert.ChangeType(value, info.PropertyType));
}
127
ответ дан 24 November 2019 в 11:08
поделиться

Ответ Томаса правильный, но я подумал, что добавлю свой вывод о том, что 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<>));
  }
39
ответ дан 24 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: