Estoy buscando una manera de filtrar los métodos que tienen el modificador unsafe
a través de la reflexión. No parece ser un atributo de método.Determinar si el método no es seguro a través de la reflexión
¿Hay alguna manera?
EDIT: Parece que esta información no está en los metadatos, al menos no puedo verla en la IL. Sin embargo, el reflector muestra el modificador unsafe
en la vista C#. ¿Alguna idea sobre cómo se hace?
EDIT 2: Para mis necesidades terminé con una comprobación, que supone que si uno de los parámetros del método es un puntero, o un tipo de devolución es un puntero, entonces el método no es seguro.
public static bool IsUnsafe(this MethodInfo methodInfo)
{
if (HasUnsafeParameters(methodInfo))
{
return true;
}
return methodInfo.ReturnType.IsPointer;
}
private static bool HasUnsafeParameters(MethodBase methodBase)
{
var parameters = methodBase.GetParameters();
bool hasUnsafe = parameters.Any(p => p.ParameterType.IsPointer);
return hasUnsafe;
}
Esto no maneja, por supuesto, una situación en la que se ejecuta un bloque inseguros dentro de un método, pero de nuevo, todo lo que me interesa es la firma del método.
Gracias!
¿Cuál es la razón para querer hacer esto? Tal vez hay una alternativa. – GenericTypeTea
@GenericTypeTea Estoy haciendo algo de generación de código a través de CodeDom. No es compatible con la generación de la palabra clave 'inseguro', por lo que me gustaría ignorar los tipos que tienen métodos' inseguros'. –
Supongo que la palabra clave insegura es solo una bandera que le dice al compilador: no genere un error de compilación aquí porque tenía la intención de usar un código no seguro. Reflector probablemente detecta el código inseguro y luego agrega la palabra clave. Noté que si usa un bloque inseguro en un método "seguro", la palabra clave insegura en Reflector se genera en la declaración del método, por lo que no genera un bloque para eso. Así que la respuesta aquí es: si Reflector puede detectar código inseguro en mscorlib, también puede ... – Koen