web-dev-qa-db-ja.com

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

編集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

したがって、MarshalAsAttributeだけでなく、カスタムまたはBCL内のいずれかで属性を返すことが完全に可能であることがわかります。


EDIT 3さて、もう少し掘り下げましたが、CFの動作は実際には )であることがわかりました。仕様に従えば正しい 。それはすべての論理に反しますが、それは正しいです。

18
ctacke