Yansıma değişiklikleri API özel durumlarını çağırır
Yansıma çağırma API'leri çağrılırken oluşan özel durumlar değişti.
Daha önce, başvuruya göre bir değer döndüren çağrılan bir yöntem döndürdüğünde
null
bir NullReferenceException oluşturuldu.Oluşturucular için aşağıdaki özel durumlar oluşturuldu:
- dahil olmak üzere OutOfMemoryExceptiongeçici özel durumlar.
- Bir OverflowException dizinin uzunluk parametresi için negatif bir değer geçirildiğinde.
Değiştirici olmadan
ref
byref benzeri bir parametre için geçirildiğindenull
(yani, değer tarafından geçirildi), özel durum oluşturmadı ve çalışma zamanı null değer için varsayılan bir değerle değiştirdi.
.NET 7'den başlayarak:
İlk parametreler doğrulandıktan sonra
Invoke()
her durumda kaynak özel durum (Önceki davranış dahil NullReferenceException ve OutOfMemoryException bahsedilir) TargetInvocationException atmak yerine oluşturulur. İç özel durum, kaynak özel durumu içerir.NotSupportedExceptionparametresi "değere göre" olarak bildirildiğinde (yani değiştiricisi olmadığında
ref
) byref benzeri bir parametre için geçirildiğindenull
oluşturulur. Parametre başvuruyla geçirildiğinde (yani değiştiriciye sahipref
olduğunda) ilgili durum için, önceki ve yeni davranış aynıdır: a NotSupportedException oluşturulur.
.NET 7
Bu değişiklik ikili uyumluluğu etkileyebilir.
TargetInvocationException Kaynak özel durum yerine oluşturma, deneyimi daha tutarlı hale getirir. Gelen parametrelerin doğrulanmasından kaynaklanan özel durumları (ile TargetInvocationExceptionsarmalanmamış) ve hedef yöntemin uygulanmasından (sarmalanan) kaynaklanan özel durumları düzgün bir şekilde katmanlar. Tutarlı kurallar, CLR ve Invoke
API'lerin farklı uygulamaları arasında daha tutarlı deneyimler sağlar.
Byref benzeri bir tür API'ye Invoke()
geçirildiğinde atılan NotSupportedException değişiklik, özgün uygulamanın bir gözetimini düzeltir ve oluşturmaz. Özgün uygulama, türlerin ref struct
API'ler tarafından Invoke()
desteklenmediği durumlarda desteklendiğini gösterir. Geçerli Invoke()
API'ler parametre türleri için kullanıldığından System.Object ve türü ref struct
için System.Objectkutulanabildiğinden, bu desteklenmeyen bir senaryodur.
çağrısı Invoke()
yaparken kullanmıyorsanız BindingFlags.DoNotWrapExceptions ve dışında TargetInvocationExceptionözel durumlar için API'lerin çevresinde Invoke()
deyimleriniz varsacatch
, bu catch
deyimleri değiştirmeyi veya kaldırmayı göz önünde bulundurun. Çağrının sonucu olarak diğer özel durumlar artık oluşturulmayacak. Ancak, hedef yöntemi çağırmaya çalışmadan önce gerçekleşen bağımsız değişken doğrulama özel durumlarını yakalıyorsanız, bu catch
deyimleri tutmanız gerekir. Çağrılmadan önce doğrulanan geçersiz bağımsız değişkenler ile TargetInvocationException sarmalanmadan oluşturulur ve semantiği değiştirmez.
Hiçbir zaman atılmış olmayacak TargetInvocationException şekilde kullanmayı BindingFlags.DoNotWrapExceptions göz önünde bulundurun. Bu durumda, kaynak özel durum tarafından TargetInvocationExceptionsarmalanmayacak. Çoğu durumda, özel durumun sarmalanmaması, tüm özel durum raporlama araçları iç özel durumu görüntülemediğinden gerçek sorunu tanılama olasılığını artırır. Buna ek olarak, kullanılarak BindingFlags.DoNotWrapExceptionsyöntemi doğrudan çağırırken olduğu gibi aynı özel durumlar oluşturulur (yansıma olmadan). Yansımanın kullanılıp kullanılmayacağının seçimi rastgele olabileceğinden veya çağıranın ortaya çıkarması gerekmeyen bir uygulama ayrıntısı olabileceğinden, çoğu durumda bu tercih edilir.
"Değere göre" geçirilen byref benzeri bir parametre içeren yansıma aracılığıyla bir yönteme varsayılan değer geçirmeniz gerektiğinde, parametresini atlayan ve hedef yöntemi bu parametre için varsayılan değerle çağıran bir sarmalayıcı yöntemi ekleyebilirsiniz.
- System.Reflection.MethodBase.Invoke(Object, Object[])
- System.Reflection.MethodBase.Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)
- System.Reflection.ConstructorInfo.Invoke(Object[])
- System.Reflection.ConstructorInfo.Invoke(BindingFlags, Binder, Object[], CultureInfo)
- System.Reflection.PropertyInfo.GetValue(Object)
- System.Reflection.PropertyInfo.GetValue(Object, Object[])
- System.Reflection.PropertyInfo.GetValue(Object, BindingFlags, Binder, Object[], CultureInfo)
- System.Reflection.PropertyInfo.SetValue(Object, Object)
- System.Reflection.PropertyInfo.SetValue(Object, Object, Object[])
- System.Reflection.PropertyInfo.SetValue(Object, Object, BindingFlags, Binder, Object[], CultureInfo)
- System.Reflection.Emit.DynamicMethod.Invoke(Object, BindingFlags, Binder, Object[], CultureInfo)
- System.Activator.CreateInstance(Type, Object[])
- System.Activator.CreateInstance(Type, Object[], Object[])
- System.Activator.CreateInstance(Type, BindingFlags, Binder, Object[], CultureInfo)
- System.Activator.CreateInstance(Type, BindingFlags, Binder, Object[], CultureInfo, Object[])
- System.Activator.CreateInstance(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: