16

Próbowałem następujący kod przy użyciu frameworku 2.0 i otrzymuję atrybut z powrotem, ale gdy próbuję to na kompaktowej strukturze, zawsze zwraca pustą tablicę. Dokumentacja MSDN mówi, że jest obsługiwana, czy robię coś złego?Jak uzyskać 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; 
    } 

Odpowiedz

16

EDIT 2

Więc jestem sprawdzanie z zespołem CF teraz, ale wierzę, że znalazłeś błąd. To pokazuje, to nawet lepiej:

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

pod pełnym ramach wrócę to:

Attributes: 1 
Attributes: 1 
Attributes: 1 

Pod CF 3.5 otrzymuję to:

Attributes: 0 
Attributes: 1 
Attributes: 1 

Więc można go zobaczyć w pełni zdolny zwracania atrybutu, niestandardowego lub w ramach BCL, po prostu nie MarshalAsAttribute.


EDIT 3 Dobra, zrobiłem trochę więcej kopanie, i okazuje się, że zachowanie CF jest rzeczywiście correct if you go by the spec. Jest to sprzeczne z wszelką logiką, ale ma rację.

+0

Mam do czynienia z FieldInfo dla mojego powyższego przykładu. Mogę spróbować sprawdzić, czy działa PropertyInfo, ale zastanawiam się, dlaczego mój przykład nie działa. – SwDevMan81

+0

boo za błędy: P Czy wiesz, czy jest jakieś obejście? – SwDevMan81

+0

Sądzę, że praca wokół może być po prostu stworzeniem mojego własnego atrybutu niestandardowego (po prostu wymyślić na nowo koło). Ponieważ wygląda tak, działa dobrze. – SwDevMan81