نحوه تکرار بر روی عناصر Enum از کد X++ در Dynamics AX 2012
منتشر شده: ۱۵ فوریهٔ ۲۰۲۵ ساعت ۲۳:۱۱:۱۱ (UTC)
این مقاله نحوه شمارش و حلقه روی عناصر یک عدد پایه در 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 شروع کنید. همانطور که خواهید دید، این کلاس چندین روش برای به دست آوردن اطلاعاتی مانند نام و برچسب از هر دو شاخص و مقدار دارد.
تفاوت بین index و مقدار در این است که index، عدد یک عنصر در 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 ارسال می شود.