metodos - declaración de atributos en c#
¿Cómo puedo obtener atributos personalizados? (1)
He intentado el siguiente código usando el marco 2.0 y me devuelven un atributo, pero cuando lo intento en el marco compacto, siempre devuelve una matriz vacía. La documentación de MSDN dice que es compatible, ¿estoy haciendo algo mal?
Test x = new Test();
FieldInfo field_info = x.GetType().GetField("ArrayShorts");
object[] custom_attributes = field_info.GetCustomAttributes(typeof(MarshalAsAttribute), false);
[StructLayout(LayoutKind.Sequential)]
public struct Test
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public ushort[] ArrayShorts;
}
Editar 2
Así que estoy consultando con el equipo de FQ ahora, pero creo que has encontrado un error. Esto lo muestra aún mejor:
public class MyAttribute : Attribute
{
public MyAttribute(UnmanagedType foo)
{
}
public int Bar { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct Test
{
[CLSCompliant(false)]
[MyAttribute(UnmanagedType.ByValArray, Bar = 4)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public ushort[] ArrayShorts;
}
class Program
{
static void Main(string[] args)
{
FieldInfo field_info = typeof(Test).GetField("ArrayShorts");
object[] custom_attributes = field_info.GetCustomAttributes(typeof(MarshalAsAttribute), false);
Debug.WriteLine("Attributes: " + custom_attributes.Length.ToString());
custom_attributes = field_info.GetCustomAttributes(typeof(MyAttribute), false);
Debug.WriteLine("Attributes: " + custom_attributes.Length.ToString());
custom_attributes = field_info.GetCustomAttributes(typeof(CLSCompliantAttribute), false);
Debug.WriteLine("Attributes: " + custom_attributes.Length.ToString());
}
}
Bajo el marco completo recupero esto:
Attributes: 1
Attributes: 1
Attributes: 1
Bajo CF 3.5 entiendo esto:
Attributes: 0
Attributes: 1
Attributes: 1
Así que puedes ver que es totalmente capaz de devolver un atributo, ya sea personalizado o dentro del BCL, pero no el atributo MarshalAsAttribute.
EDITAR 3 Muy bien, hice un poco más de investigación, y resulta que el comportamiento de la FQ es realmente correcto si sigues la especificación . Va contra toda lógica, pero está bien.