2016-05-13 8 views
2

.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?存在しない可能性のあるリフレクションを使用してプロパティを設定する

だから私はから私のコードを変更:

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

client.DeliveryFormat = SmtpDeliveryFormat.International; 

この列挙のみも4.5で追加されましたので、しかし、今、私はSmtpDeliveryFormatについての代わりに投げTypeLoadExceptionを取得します。

この2番目の問題を回避するにはどうすればよいですか?

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

ちょうど不思議なことに、必要なフレームワークなしでシステム上で4.5アプリを実行することは可能ですか?古いバージョンからライブラリを動的にロードしているということですか? – Gusman

+0

プロパティの値を設定する前にプロパティの存在を確認できないのはなぜですか? – thehennyy

+0

また、TypeLoadExceptionは、ロードできないタイプを通知します。 – Gusman

答えて

1

1つのオプションは、反射してすべての道を行くことです。

+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(client 、Enum.Parse(enumType、 "International"、null)); – Evk

+0

ええ、私はちょうど投稿する前にそれをテストしていた:) –

関連する問題