PDA

View Full Version : داشتن لیستی از کلمات و استفاده از آنها در پروژه (به طور مثال Enum)



majid_darab
دوشنبه 30 فروردین 1389, 05:47 صبح
با سلام و عرض خسته نباشید خدمت دوستان عزیز :
من لیستی از کلمات را مد نظر دارم که می خوام در همه جای پروژه قابل دسترس باشند و تغییر در این لیست برای همه جا اعمال شود ...
منظورم از لیست ، لیست C#‎‎‎ نیست ...:)
به ذهنم رسید از enum استفاده کنم...
اما enum دو تا بدی داره :
1- اگر تغییرش بدی ، جاهایی از کد که از اون کلمه ی خاص در Enum استفاده کرده بودن به مشکل می خورن
2-تو enum مجاز به نوشتن کاراکترهایی مثل دش و یا فاصله نیستیم...
به نظر شما بهترین کار برای انجام چنین کاری چیست ؟(داشتن دراپ دانی از کلماتی که در جایی دیگر (مثلاً در یک کلاس) تایپ شده اند - در نتجه نیاز به تایپ مجدد کلمه نیست)
با تشکر
مجید

amirjalili
دوشنبه 30 فروردین 1389, 11:31 صبح
با توجه به چیزی که من در پروژه های بزرگ دیدم از xml برای دیکشنری شون استفاده میکنن.
xml راه حل مناسبیه.

majid_darab
سه شنبه 31 فروردین 1389, 07:15 صبح
با سلام ...
مگر نه این است که Xml نوعی دیتا سورس به حساب می آید ...
آیا می شود از اطلاعات داخل آن به صورت دراپ دانی استفاده کرد؟
با تشکر

Vahid_moghaddam
سه شنبه 31 فروردین 1389, 08:50 صبح
شما می تونید این لیست رو از هر جا که هست بخونید. از یه فایل xml، از یه فایل txt، از ms sql از access و ....
برای دسترسی به این لیست، اگه این لیست بین تمام کاربرها مشترکه، می تونید اون رو cache کنید.

mehdi.mousavi
سه شنبه 31 فروردین 1389, 11:31 صبح
با سلام و عرض خسته نباشید خدمت دوستان عزیز :
من لیستی از کلمات را مد نظر دارم که می خوام در همه جای پروژه قابل دسترس باشند و تغییر در این لیست برای همه جا اعمال شود ... منظورم از لیست ، لیست C#‎‎‎‎ نیست ...:)
به ذهنم رسید از enum استفاده کنم... اما enum دو تا بدی داره :
1- اگر تغییرش بدی ، جاهایی از کد که از اون کلمه ی خاص در Enum استفاده کرده بودن به مشکل می خورن
2-تو enum مجاز به نوشتن کاراکترهایی مثل دش و یا فاصله نیستیم...
به نظر شما بهترین کار برای انجام چنین کاری چیست ؟(داشتن دراپ دانی از کلماتی که در جایی دیگر (مثلاً در یک کلاس) تایپ شده اند - در نتجه نیاز به تایپ مجدد کلمه نیست)
با تشکر
مجید

سلام.
اگر این مقادیر ثابت هستن، تغییر نمیکنن و نیازی نیست تا اونها رو بعد Deploy کردن برنامه تغییر بدید؛ به بیان دیگه Compile مجددا برنامه پس از اعمال تغییر در این لیست براتون اهمیتی نداره، می تونید از enum استفاده کنید. بدین منظور، اینطور عمل کنید:


public enum WhateverEnum
{
[DescriptionAttribute("Whatever description that belongs to ItemNumberOne goes here...")]
ItemNumberOne = 1,

[DescriptionAttribute("Whatever description that belongs to ItemNumberTwo goes here...")]
ItemNumberTwo = 2
}


اینجا، من یک enum تعریف کردم و به هر یک مقدار خاصی Assign کردم. هر جا نیاز باشه که مقایسه ای انجام بدم از عدد متناظر با اون enum استفاده میکنم و هر جا به توضیحات متناظر با اون enum نیاز داشته باشم، میتونم با استفاده از این تابع:


public static string GetDescription(Enum en)
{
MemberInfo[] memInfo = en.GetType().GetMember(en.ToString());
if (memInfo != null && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
return ((DescriptionAttribute)attrs[0]).Description;
}

return en.ToString();
}


توضیحات متناظر با اون enum رو بگیرم و استفاده کنم. بطور مثال:

string desc = GetDescription(WhateverEnum.ItemNumberTwo);

این روش به درد جاهایی میخوره که زیاد اینکارو نمیخواهید تکرار کنید، یا براتون Cache کردن این string ها امکان پذیره. چون از Reflection استفاده میکنه، سرعتش در مقایسه با سرعت اجرای کدهای دیگه، پایینتره در نتیجه برای کارهای CPU-Intensive توصیه نمیشه.

روش دیگه استفاده از فایل web.config هستش. بدین ترتیب که شما با ایجاد کلاسهایی اقدام به ساخت Section جدیدی برای نگهداری این اطلاعات کنید. خوبی این روش اینه که در صورت نیاز به تغییر، دیگه نیازی نیست برنامه رو Compile کنید، اما بازهم به طرز استفاده شما برمیگرده... این روش فکر می کنم بیش از دو بار در انجمنها توضیح داده شده، بنابراین در صورت نیاز، میتونید جستجو کنید.

روش دیگه، استفاده از Resource ها هستش. اونجا هم، میتونید داده های مورد نظرتون رو نگهداری کنید، اما در این روش نیز، مثل روش اول، هر تغییری مستلزم کامپایل مجدد برنامه خواهد بود.

موفق باشید.

Behrouz_Rad
سه شنبه 31 فروردین 1389, 13:22 عصر
http://stackoverflow.com/questions/725043/dynamic-enum-in-c

majid_darab
سه شنبه 31 فروردین 1389, 13:35 عصر
با سلام و عرض تشکر از همیاری شما دوستان عزیز:
موضوعی که در مورد Enum فرمودید بسیار جالب بود ...
با انجام این کار دوتا مشکل مربوط به گذاشتن فاصله و تغییر در enum حل شد ...
امّا موضوعی که می مونه اینه که اگر من مثلاً بین 100-1000 کلمه داشته باشم و هر جا که بخوام از توضیح مربوطه در ENUM استفاده کنم باید یه سر بزنم به ENUM و دنبال شماره مورد اون کلمه بگردم ...
نمیشه دراپ داونی از این توضیحات برای استفاده در اختیار داشته باشیم؟
با تشکر

mehdi.mousavi
سه شنبه 31 فروردین 1389, 13:49 عصر
نمیشه دراپ داونی از این توضیحات برای استفاده در اختیار داشته باشیم؟ با تشکر

سلام.
اینکار بسادگی انجام پذیره:


List<string> desc = new List<string>();
foreach (WhateverEnum en in Enum.GetValues(typeof(WhateverEnum)))
desc.Add(GetDescription(en));


سپس اون DropDownList رو به این List بایند کنید.

موفق باشید.

پاورقی: حتما این مقادیر رو یکبار Cache کنید، تا هر بار نیاز به فراخوانی تابع فوق نباشه.

majid_darab
چهارشنبه 01 اردیبهشت 1389, 03:01 صبح
سلام.
اینکار بسادگی انجام پذیره:


List<string> desc = new List<string>();
foreach (WhateverEnum en in Enum.GetValues(typeof(WhateverEnum)))
desc.Add(GetDescription(en));


سپس اون DropDownList رو به این List بایند کنید.

موفق باشید.

پاورقی: حتما این مقادیر رو یکبار Cache کنید، تا هر بار نیاز به فراخوانی تابع فوق نباشه.


دست شما درد نکنه که با صبرو حوصله پاسخگوی سوالات مطرح شده بودید ...
من در پست یکی در میان از بالا موردی که در مورد دراپ داون نوشتم ، منظورم دراپ داونی بود که همراه با خاصیت Intellisense در vs ظاهر میشه ، یعنی وقتی در این محیط به طور مثال اسم یک e-num را تاپیپ می کنید و دکمه ی دات را می زنید عناوین مربوط به این enum دراختیار شما قرار می گیرد ...مثل در اختیار قرار دادن پروپرتی ها و متد ها و ...
وخوب منظورمو خوب بیان نکرده بودم ...
به هر تقدیر اصلاً مهم نیست و باعث شد چیزهایی بیشتری از زبان شیرین c# یاد بگیرم.

به طور مثال تا حالا پیش نیومده بود که عمل Catch کردنو انجام بدم ...
میشه در این باره راهنمایی بفرمایید !!

در ضمن تاپیکی هم که آقا بهروز لطف کردند گذاشتند نیز جالب بود.

majid_darab
جمعه 03 اردیبهشت 1389, 05:01 صبح
با سلام :
مقاله ی مفید زیر در رابطه با catch کردن می باشد که خوب پرداختن به آن با موضوع تاپیک همخوانی ندارد و فقط به منظور ادامه ی بحث عنوان شده اونو بیان کردم ...
http://barnamenevis.org/forum/showthread.php?t=123309
اما در مورد کچ کردن به طور مثال یک xml چگونه باید عمل کرد(که فقط برای developer در محیط برنامه نویسی کاربرد دارد و موردی متفاوت تر ار مقاله ی بالا می باشد)
با تشکر