Как получить GetCustomAttributes?

Я пробовал следующий код, используя фреймворк 2.0, и возвращаю атрибут, но когда я пытаюсь это сделать в компактной структуре, он всегда возвращает пустой массив. Предполагаемая MSDN заявка подтверждает, что я делаю что-то неправильно?

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

Ответы

Ответ 1

РЕДАКТИРОВАТЬ 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.


РЕДАКТИРОВАТЬ 3 Хорошо, я сделал немного больше копания, и оказывается, что поведение CF на самом деле правильно, если вы идете по спецификации. Это противоречит всей логике, но это правильно.