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