2016-05-13 3 views
2

При попытке установить свойство, добавленное в .Net 4.5, в системе, которая имеет только .Net 4.0, вы получаете MissingMemberException (https://msdn.microsoft.com/en-us/library/system.missingmemberexception(v=vs.110).aspx). Однако вы можете поймать это только при использовании отражения, иначе это нечеткое исключение JIT. (Why is it not possible to catch MissingMethodException?)Настройка свойства с использованием отражения, которое может отсутствовать

Так что я изменил код из:

client.DeliveryFormat = SmtpDeliveryFormat.International; 

в

var p = client.GetType().GetProperty("DeliveryFormat"); 
if(p!=null) 
p.SetValue(client, SmtpDeliveryFormat.International); 

Однако теперь я получаю TypeLoadException выброшен вместо о SmtpDeliveryFormat, потому что это перечисление было добавлено только в 4.5 также.

Как я могу обойти эту вторую проблему?

+0

Любопытно, можно ли даже запустить приложение 4.5 на системе без необходимой структуры? или вы имеете в виду, что вы динамически загружаете библиотеки из более старых версий? – Gusman

+0

Почему вы не можете проверить наличие свойства перед установкой его значения? – thehennyy

+0

Кроме того, TypeLoadException сообщает, какой тип не может быть загружен? – Gusman

ответ

1

Одним из вариантов являются идти с отражением всего путем:

var prop = client.GetType().GetProperty("DeliveryFormat"); 
if (prop != null) { 
    var enumType = typeof (SmtpClient).Assembly.GetType("System.Net.Mail.SmtpDeliveryFormat"); 
    prop.SetValue(client, Enum.Parse(enumType, "International", null));         
} 

Это не должно бросать метод недостающего или типа нагрузки исключения в вашем случае.

+0

Вам понравится это, но эта перегрузка 'PropertyInfo.SetValue' тоже не существует в 4.0! https://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.setvalue(v=vs.100).aspx –

+0

@ Mr.Boy, а затем используйте тот, который существует :) prop.SetValue (клиент , Enum.Parse (enumType, "International", null)); – Evk

+0

Да, я просто тестировал это перед публикацией :) –

Смежные вопросы