16

Ich habe den folgenden Code mit dem Framework 2.0 versucht und ich bekomme ein Attribut zurück, aber wenn ich dies auf dem kompakten Framework versuche, es immer ein leeres Array zurückgibt. Die MSDN-Dokumentation sagt, dass sie unterstützt wird, mache ich etwas falsch? 2Wie bekomme ich 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; 
    } 

Antwort

16

EDIT

Also Ich überprüfe jetzt mit dem CF-Team, aber ich glaube, dass Sie einen Fehler gefunden haben. Dies zeigt, es noch besser:

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

Unter dem vollen Rahmen, den ich dies zurück:

Attributes: 1 
Attributes: 1 
Attributes: 1 

Unter CF 3.5 ich diese:

Attributes: 0 
Attributes: 1 
Attributes: 1 

So kann man es sehen, ist durchaus in der Lage der Rückgabe eines Attributs, entweder benutzerdefiniert oder innerhalb der BCL, nur nicht das MarshalAsAttribute.


EDIT 3 Okay, habe ich ein wenig mehr zu graben, und es stellt sich heraus, dass das CF Verhalten tatsächlich correct if you go by the spec ist. Es geht gegen alle Logik, aber es ist richtig.

+0

Ich habe mit der FieldInfo für mein Beispiel oben zu tun. Ich kann versuchen, ob PropertyInfo funktioniert, aber ich frage mich, warum mein Beispiel nicht funktioniert. – SwDevMan81

+0

boo for bugs: P Weißt du, ob es eine Arbeit gibt? – SwDevMan81

+0

Ich denke, die Arbeit könnte nur sein, um meine eigene benutzerdefinierte Attribut zu erstellen (nur neu erfinden das Rad ich denke)? Da sieht das schon gut aus. – SwDevMan81