سؤال

وعن طريق C #، لا أحد يعرف كيفية الحصول على قيمة Sizeconst وMarshalAsAttribute في وقت التشغيل؟

وعلى سبيل المثال. أود أن استرداد قيمة 10.

[StructLayout[LayoutKind.Sequential, Pack=1]
Class StructureToMarshalFrom
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public byte[] _value1;
}
هل كانت مفيدة؟

المحلول

نعم، مع انعكاس:

FieldInfo field = typeof(StructureToMarshalFrom).GetField("_value1");
object[] attributes = field.GetCustomAttributes(typeof(MarshalAsAttribute), false);
MarshalAsAttribute marshal = (MarshalAsAttribute) attributes[0];
int sizeConst = marshal.SizeConst;

و(غير مختبر، ومن الواضح تفتقر بدلا الكثير من التحقق من الخطأ، ولكن يجب أن تعمل.)

نصائح أخرى

var x = new StructureToMarshalFrom();
var fields = x.GetType().GetFields();

var att = (MarshalAsAttribute[])fields[0].GetCustomAttributes(typeof(MarshalAsAttribute), false);
if (att.Length > 0) {
    Console.WriteLine(att[0].SizeConst);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top