Bagikan melalui


Anotasi yang lebih terbatas pada InvokeMember/FindMembers/DeclaredMembers

Mulai dari .NET 10, System.Reflection API InvokeMember, , FindMembersdan DeclaredMembers menggunakan anotasi yang lebih terbatas alih-alih DynamicallyAccessedMemberTypes.All.

Perubahan ini memengaruhi skenario di mana pengembang mengimplementasikan IReflect antarmuka atau berasal dari TypeInfo. Penggunaan DynamicallyAccessedMemberTypes.All sebelumnya terlalu permisif dan dapat menyebabkan perilaku yang tidak diinginkan, seperti menangkap metode antarmuka yang diterapkan oleh kelas atau menghasilkan peringatan karena panggilan refleksi yang tidak aman.

Versi yang diperkenalkan

.NET 10

Perilaku sebelumnya

Sebelumnya, API yang dipengaruhi menggunakan anotasi DynamicallyAccessedMemberTypes.All, yang terlalu permisif. Hal ini dapat mengakibatkan pengambilan anggota tambahan, seperti metode antarmuka yang diterapkan oleh kelas, dan berpotensi menyebabkan peringatan runtime atau panggilan pantulan yang tidak aman.

Perilaku baru

API yang terpengaruh sekarang menggunakan anotasi yang lebih terbatas, yang memberikan kontrol yang lebih baik atas elemen yang ditangkap selama refleksi.

Jenis perubahan yang memutus kompatibilitas

Perubahan ini adalah perubahan perilaku dan dapat memengaruhi kompatibilitas sumber.

Alasan perubahan

Perubahan ini diperkenalkan untuk meningkatkan akurasi anotasi dalam System.Reflection API dan untuk mengatasi masalah yang disebabkan oleh anotasi yang terlalu permisif DynamicallyAccessedMemberTypes.All . Ini memastikan kompatibilitas yang lebih baik dengan skenario pemangkasan dan refleksi, mengurangi peringatan runtime, dan mencegah panggilan refleksi yang tidak aman.

Jika Anda menerapkan IReflect atau memperoleh dari TypeInfo, tinjau kode Anda dan perbarui anotasi untuk menyelaraskan dengan perilaku baru. Khususnya:

  1. Ganti DynamicallyAccessedMemberTypes.All anotasi dengan anotasi yang lebih terbatas, seperti DynamicallyAccessedMemberTypes.PublicMethods, , DynamicallyAccessedMemberTypes.NonPublicMethodsatau jenis lain yang sesuai.

    Cuplikan kode berikut menunjukkan contoh.

    class MyType : IReflect
    {
        [DynamicallyAccessedMembers(
            DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields |
            DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods |
            DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties |
            DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
         public object InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target,
             object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters)
         { }
    }
    
  2. Uji skenario refleksi untuk memastikan bahwa anotasi yang diperbarui mengidentifikasi anggota yang dimaksud dan tidak menimbulkan kesalahan runtime atau peringatan.

Untuk informasi lebih lengkap tentang DynamicallyAccessedMembers anotasinya dan cara penggunaannya, lihat Menyiapkan pustaka .NET untuk pengurangan.

API yang terpengaruh