16

Я пробовал следующий код, используя фреймворк 2.0, и возвращаю атрибут, но когда я пытаюсь это сделать в компактной структуре, он всегда возвращает пустой массив. Предполагаемая MSDN заявка подтверждает, что я делаю что-то неправильно?Как получить 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; 
    } 

ответ

16

EDIT 2

Так я теперь проверить с командой CF, но я верю, что вы нашли ошибку. Это показывает, что он еще лучше:

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

Под полной базы я вернусь в следующем:

Attributes: 1 
Attributes: 1 
Attributes: 1 

Под CF 3.5 я получаю это:

Attributes: 0 
Attributes: 1 
Attributes: 1 

Таким образом, вы можете увидеть его полностью дееспособным возврата атрибута, как пользовательского, так и внутри BCL, а не атрибута MarshalAsAttribute.


EDIT 3 Хорошо, я сделал немного больше рыть, и оказывается, что поведение CF фактически correct if you go by the spec. Это противоречит всей логике, но это правильно.

+0

Я имею дело с FieldInfo для моего приведенного выше примера. Я могу попробовать и посмотреть, будет ли PropertyInfo работать, но мне интересно, почему мой пример не работает. – SwDevMan81

+0

boo для ошибок: P Знаете ли вы, есть ли работа вокруг? – SwDevMan81

+0

Я предполагаю, что работа вокруг может быть только для создания моего собственного атрибута (просто изобретать колесо, я думаю)? Поскольку выглядит так, все работает нормально. – SwDevMan81