使用可能不存在的反射设置属性

时间:2016-05-13 10:45:58

标签: c# .net reflection

当尝试在仅具有.Net 4.0的系统上设置.Net 4.5中添加的属性时,您获得MissingMemberExceptionhttps://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中添加。

我如何解决第二个问题?

1 个答案:

答案 0 :(得分: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));                                
}

在您的情况下,这不应该丢失丢失的方法或类型加载异常。