PDA

View Full Version : مقایسه ی دو متغیر با تایپ های مختلف



WindowsXp
چهارشنبه 19 آبان 1389, 20:09 عصر
سلام
یک متغیر دارم از جنس Type و نام CurrentFieldType
دو تا متغیر دارم از جنس Object و نام var1 , var 2
می دونم دو تا متغیرم جنس اصلیشون CurrentFieldType است.
می خوام این دو تا رو با هم قیاس کنم .
مثلا ببینیم var1>var2 ارزشش درسته یا خیر!
وقتی Cast می کنم بهم ارور میده میگه اپراتور < رو نمی تونی بین دو تا object قرار بدی!
راه حل چیه به نظرتون؟؟
ضمنا بگم مطمئن هستم Type اصلی دو تا متغیرم طوری هست که میشه < رو بینشون گذاشت.

Reza_Yarahmadi
چهارشنبه 19 آبان 1389, 20:38 عصر
اگر بصورت زیر کار کنید نباید خطا بده

if((CurrentFieldType)var1 > (CurrentFieldType)var2)
...

WindowsXp
چهارشنبه 19 آبان 1389, 20:56 عصر
اگر بصورت زیر کار کنید نباید خطا بده

if((CurrentFieldType)var1 > (CurrentFieldType)var2)
...
نه اشکال میگیره !

Error 1 The type or namespace name 'CurrentFieldType' could not be found (are you missing a using directive or an assembly reference?)

Reza_Yarahmadi
چهارشنبه 19 آبان 1389, 21:26 عصر
دوست عزیز شما گفتید 2 متغیر از نوع CurrentFieldType هستند من هم با همین فرض اون کد رو نوشتم.
این خطایی که میده به این خاطره که کلاس یا نوع داده ای با عنوان CurrentFieldType پیدا نمیکنه. برای حلش باید نوع 2 متغیر رو به جای CurrentFieldType بذارید.

WindowsXp
چهارشنبه 19 آبان 1389, 22:48 عصر
دوست عزیز شما گفتید 2 متغیر از نوع CurrentFieldType هستند من هم با همین فرض اون کد رو نوشتم.
این خطایی که میده به این خاطره که کلاس یا نوع داده ای با عنوان CurrentFieldType پیدا نمیکنه. برای حلش باید نوع 2 متغیر رو به جای CurrentFieldType بذارید.
عزیزم عرض کردم var1 , var2 هر دو از جنس System.Object هستند.
همون طور که می دونید هر کلاسی در دات نت زیر مجموعه ی System.Object است.
var1 , var 2 هم اسما Object هستند اما در واقع از جنس CurrentFieldType هستند .
CurrentFieldType نوع داده یا (Datatype)نیست بلکه یم متغیر از جنس System.Type است که اطلاعات مربوط به Datatype واقعی var1,var2 داخلش است.

mohamad.alijani
چهارشنبه 19 آبان 1389, 23:18 عصر
تا اون جايي كه من اطلاع دارم براي همچين مواردي بايد از تعريف مجدد عملگر استفاده كرد. (البته راه حل هاي ديگه اي هم هست).
با اين حساب كه شما مي گيد يعني اپراتور > و < براي اين شيء تعريف شده؟

kamran00f
چهارشنبه 19 آبان 1389, 23:20 عصر
سلام
وقتی Cast می کنم بهم ارور میده میگه اپراتور < رو نمی تونی بین دو تا object قرار بدی!
راه حل چیه به نظرتون؟؟
ضمنا بگم مطمئن هستم Type اصلی دو تا متغیرم طوری هست که میشه < رو بینشون گذاشت.

خوب راست میگه این اپراتورو بین 2تا آبجکت نمیشه نوشت. ولی وقتی cast میکنی اگه برای اون type ایکه بهش cast کردی این اپراتور تعریف شده باشه نباید مشکلی پیش بیاد. خودتم که گفتی مطمئنی این اچراتور واسه اون تایپ تعریف شده، ولی این اروری که گفتی میگیره:


نه اشکال میگیره !

Error 1 The type or namespace name 'CurrentFieldType' could not be found (are you missing a using directive or an assembly reference?)


احتمالا به این دلیله که CurrentFieldType درست set نشده و مقدارش type ای که منظورته نیست. البته فقط همین به ذهن من رسید. شاید قضیه یه چیز دیگس.

WindowsXp
چهارشنبه 19 آبان 1389, 23:20 عصر
تا اون جايي كه من اطلاع دارم براي همچين مواردي بايد از تعريف مجدد عملگر استفاده كرد. (البته راه حل هاي ديگه اي هم هست).
با اين حساب كه شما مي گيد يعني اپراتور > و < براي اين شيء تعريف شده؟
موضوع اینه این عملگر رو توی کدوم کلاس تعریف کنم؟

WindowsXp
چهارشنبه 19 آبان 1389, 23:29 عصر
اجازه بدید من بیشتر توضیح بدم!
من یک متد دارم که باید دو تا پارامتر بگیره.
این دو پارامتر هر جنسی می تونه داشته باشه.
برای همین پارامتر هام رو از جنس System.Object گرفتم تا زمان استفاده از متد هر متغیری رو بشه بهش پاس کرد.
حالا شما فرض کنید این متد باید نتیجه اپراتور > رو برگردونه !چه کار می کنید؟
به جز Generic !

WindowsXp
پنج شنبه 20 آبان 1389, 23:42 عصر
کسی چیزی نمی دونه که بهم جواب بده؟
اگر نوع داده ها صرفا Double , String , int .. باشه میشه بامتد ToString() و String.Compare مقایسه رو انجام داد اما اگر تایپی غیر از اینا باشه خب نمیشه دیگه...راه حل لطفا!

mohsen_csharp
جمعه 21 آبان 1389, 11:15 صبح
به جز Generic
چرا به جز جنریک؟؟؟

WindowsXp
جمعه 21 آبان 1389, 11:45 صبح
چون دنبال راه حل دیگه ای میگردم .
راه حلی با دخالت System.Object که بتونه کار Generic رو انجام بده.

mahdi87_gh
جمعه 21 آبان 1389, 12:07 عصر
دوست عزیز راه حل دیگه میتونه این باشه که چند تابع با انواع متفاوت پارامترهای ورودی ایجاد کنید

mohsen_csharp
جمعه 21 آبان 1389, 20:06 عصر
چون دنبال راه حل دیگه ای میگردم .
راه حلی با دخالت System.Object که بتونه کار Generic رو انجام بده.
با سلام
به جز جنریک تنها راهی که میشناسم اینه که از Type و Reflection استفاده کنی
و حتما باید اشیایی که قرار مقایسه شوند اینترفیس IComparable رو Implement کرده باشند.
انواع داده های اولیه مانند int این اینترفیس رو Implement کرده اند


private void button1_Click(object sender, EventArgs e)
{
int z = this.myCompare(4, 3);
switch (z)
{
case 1: MessageBox.Show(">"); break;
case 0: MessageBox.Show("="); break;
case -1: MessageBox.Show("<"); break;
case -2: MessageBox.Show("not Comparable"); break;
}
}
public int myCompare(object obj1, object obj2)
{
Type t1 = obj1.GetType();
Type t2 = obj2.GetType();
if (t1 == t2)
{
Type ti = t1.GetInterface("IComparable");
if (ti != null)
{
System.Reflection.MethodInfo mi = ti.GetMethod("CompareTo");
object returnValue = mi.Invoke(obj1, new object[] { obj2 });
return (int)returnValue;
}
}
return -2;
}


دوست عزیز راه حل دیگه میتونه چند ریختی باشه. صد البته در این صورت باید چند تابع با انواع متفاوت پارامترهای ورودی ایجاد کنید
به این موضوع که شما می فرمایید چندریختی نمی گن بلکه method overloading میگن
چندریختی در ارث بری معنا پیدا میکنه

kamran00f
جمعه 21 آبان 1389, 20:13 عصر
موضوع اینه این عملگر رو توی کدوم کلاس تعریف کنم؟

باید این اپراتور رو override کنی. یه سرچی بکن چون من دقیق پیاده سازیشو بلد نیستم با این که خیلی ساده هست. راجع به override کردن اپراتور ها سرچ کن.

WindowsXp
جمعه 21 آبان 1389, 20:49 عصر
واقعا ممنونم آقا محسن
سوال رو خیلی از دوستان اصلا نقهمیدن به هر حال ما جوابمون رو گرفتیم !