Compartir a través de


Anotaciones más restringidas en InvokeMember/FindMembers/DeclaredMembers

A partir de .NET 10, las System.Reflection API InvokeMember, FindMembersy DeclaredMembers usan anotaciones más restringidas en lugar de DynamicallyAccessedMemberTypes.All.

Este cambio afecta a escenarios en los que los desarrolladores implementan la IReflect interfaz o derivan de TypeInfo. El uso anterior de DynamicallyAccessedMemberTypes.All era excesivamente permisivo y podría provocar un comportamiento no deseado, como capturar métodos de interfaz implementados por una clase o generar advertencias debido a llamadas de reflexión no seguras.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, las API afectadas usaban la DynamicallyAccessedMemberTypes.All anotación, que era demasiado permisiva. Esto podría dar lugar a la captura de miembros adicionales, como los métodos de interfaz implementados por una clase y, posiblemente, provocar advertencias en tiempo de ejecución o llamadas de reflexión no seguras.

Nuevo comportamiento

Las API afectadas ahora usan anotaciones más restringidas, lo que proporciona un mejor control sobre los miembros capturados durante la reflexión.

Tipo de cambio disruptivo

Este cambio es un cambio de comportamiento y puede afectar a la compatibilidad de origen.

Motivo del cambio

El cambio se introdujo para mejorar la precisión de las anotaciones en System.Reflection las API y para solucionar problemas causados por la anotación excesivamente permisiva DynamicallyAccessedMemberTypes.All . Esto garantiza una mejor compatibilidad con escenarios de recorte y reflexión, reduce las advertencias en tiempo de ejecución y evita llamadas de reflexión no seguras.

Si implementa IReflect o deriva de TypeInfo, revise el código y actualice las anotaciones para alinearse con el nuevo comportamiento. Specifically:

  1. Reemplace DynamicallyAccessedMemberTypes.All las anotaciones por anotaciones más restringidas, como DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodsu otros tipos adecuados.

    En el fragmento de código siguiente se muestra un ejemplo.

    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. Pruebe los escenarios de reflexión para asegurarse de que las anotaciones actualizadas representen a los miembros previstos y no introduzcan errores o advertencias durante la ejecución.

Para obtener más información sobre DynamicallyAccessedMembers las anotaciones y su uso, consulte Preparación de bibliotecas de .NET para el recorte.

Las APIs afectadas