16

Ho provato il seguente codice utilizzando il framework 2.0 e ottengo un attributo di nuovo, ma quando provo questo sul framework compatto, restituisce sempre un array vuoto. La documenazione MSDN dice che è supportata, sto facendo qualcosa di sbagliato?Come si ottiene GetCustomAttributes?

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; 
    } 

risposta

16

EDIT 2

così sto controllando con il team CF, ma ora credo di aver trovato un bug. Questo dimostra ancora meglio:

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()); 
    } 
} 

Nell'ambito del quadro completo torno questo:

Attributes: 1 
Attributes: 1 
Attributes: 1 

Sotto CF 3.5 ottengo questo:

Attributes: 0 
Attributes: 1 
Attributes: 1 

Così si può vedere che è pienamente in grado di restituire un attributo, personalizzato o all'interno del BCL, non solo MarshalAsAttribute.


EDIT 3 Va bene, ha fatto un po 'più di scavo, e si scopre che il comportamento CF è in realtà correct if you go by the spec. Va contro ogni logica, ma è giusto.

+0

Ho a che fare con FieldInfo per il mio esempio precedente. Posso provare a vedere se PropertyInfo funzionerebbe, ma mi chiedo perché il mio esempio non funzioni. – SwDevMan81

+0

boo per bug: P Sai se c'è un problema? – SwDevMan81

+0

Immagino che il lavoro attorno potrebbe essere semplicemente creare il mio attributo personalizzato (reinventare la ruota solo credo)? Dal momento che sembra che funziona ok. – SwDevMan81