نحوه تکرار بر روی عناصر Enum از کد X++ در Dynamics AX 2012
منتشر شده: ۱۵ فوریهٔ ۲۰۲۵ ساعت ۲۳:۱۱:۱۱ (UTC)
آخرین به روز رسانی: ۱۲ ژانویهٔ ۲۰۲۶ ساعت ۸:۴۲:۱۲ (UTC)
این مقاله نحوه شمارش و پیمایش عناصر یک enum پایه در Dynamics AX 2012 را توضیح میدهد، از جمله یک مثال کد X++.
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
اطلاعات موجود در این پست بر اساس Dynamics AX 2012 R3 است. ممکن است برای نسخههای دیگر معتبر باشد یا نباشد.
من اخیراً در حال ایجاد فرمی بودم که نیاز داشت برای هر عنصر در یک enum یک مقدار نمایش دهد. به جای اینکه فیلدها را به صورت دستی ایجاد کنم (و سپس در صورت تغییر enum نیاز به نگهداری فرم داشته باشم)، تصمیم گرفتم آن را به صورت پویا پیادهسازی کنم تا به طور خودکار فیلدها را در زمان اجرا به طرح اضافه کند.
با این حال، خیلی زود متوجه شدم که پیمایش روی مقادیر در یک enum، اگرچه وقتی نحوهی انجامش را یاد بگیرید به اندازهی کافی آسان است، اما کمی گیجکننده است.
بدیهی است که باید با کلاس DictEnum شروع کنید. همانطور که خواهید دید، این کلاس چندین متد برای دریافت اطلاعاتی مانند نام و برچسب از هر دو اندیس و مقدار دارد.
تفاوت بین اندیس و مقدار این است که اندیس شماره یک عنصر در enum است، اگر عناصر enum به ترتیب از صفر شمارهگذاری شده باشند، در حالی که مقدار، ویژگی "مقدار" واقعی عنصر است. از آنجایی که اکثر enumها دارای مقادیری هستند که به ترتیب از 0 شمارهگذاری شدهاند، اندیس و مقدار یک عنصر اغلب یکسان خواهند بود، اما مطمئناً نه همیشه.
اما چطور بفهمیم یک enum چه مقادیری دارد؟ اینجاست که گیجکننده میشود. کلاس DictEnum متدی به نام values() دارد. ممکن است انتظار داشته باشید که این متد لیستی از مقادیر enum را برگرداند، اما بدیهی است که این کار خیلی آسان خواهد بود، بنابراین در عوض تعداد مقادیری را که enum در بر دارد، برمیگرداند. با این حال، تعداد مقادیر هیچ ارتباطی با مقادیر واقعی ندارد، بنابراین باید از این عدد به عنوان مبنایی برای فراخوانی متدهای مبتنی بر شاخص استفاده کنید، نه متدهای مبتنی بر مقدار.
اگر به جای آن، این متد را indexes() نامگذاری میکردند، کمتر گیجکننده میبود ;-)
همچنین در نظر داشته باشید که مقادیر enum (و ظاهراً این "اندیسها") از 0 شروع میشوند، برخلاف اندیسهای آرایه و کانتینر در X++ که از 1 شروع میشوند، بنابراین برای پیمایش عناصر در یک enum میتوانید کاری شبیه به این انجام دهید:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
این دستور نماد و برچسب هر عنصر در enum را به infolog ارسال میکند.
مطالعه بیشتر
اگر از این پست لذت بردید، ممکن است این پیشنهادات را نیز بپسندید:
- بررسی سریع Dynamics AX 2012 SysOperation Framework
- استفاده از چارچوب SysExtension برای یافتن اینکه کدام زیر کلاس را در Dynamics AX 2012 نمونه سازی کنیم
- استفاده از یک کوئری در کلاس قرارداد داده SysOperation در Dynamics AX 2012
