PDA

View Full Version : dynamic casting



AmirAlimadadi
سه شنبه 08 اردیبهشت 1388, 16:10 عصر
با سلام به همه
من یه جدول دارم که توی اون اشیایی رو ذخیره می کنم، به این صورت که توی یکی از ستونهاش نوع شی (Type) و توی یکی دیگه از ستونهاش مقدار (Value) اون شی رو به صورت string می ریزم، اما مشکل من اینه که موقع خوندن از این جدول، یه شی از نوع object دارم که می خوام ستون مقدار (Value) هر سطر رو بخونه و اون رو به ستون (Type)
cast کنه و توی شی که از نوع object هست بریزه.
باید دوباره بگم که ستونهای ما در جدول از نوع string هست.
من می خواستم با استفاده از کلمه کلیدی as این کار رو بکنم، اما بعد از as باید حتما یکی از type های شناخته شده در پروژه رو بنویسیم، که در اینجا ستون type رو نمی شناسه.

esmaeily-hosein
سه شنبه 08 اردیبهشت 1388, 16:39 عصر
Type type=Type.GetType ("typeName");

prankster
سه شنبه 08 اردیبهشت 1388, 16:51 عصر
اگر بخواهيم object از Type مورد نظر بسازيم:


Object o = Activator.CreateInstance(Type.GetType("typeName"));


فقط type مربوطه بايد يك Constructor بدون پارامتر داشته باشد!

AmirAlimadadi
چهارشنبه 09 اردیبهشت 1388, 13:17 عصر
ممنون از راهنماییتون
ولی منظور من اینه که می خوام یه شی رو به این type تبدیل(cast) کنم، اگه کد شما رو بنویسم، می خوام یه همچین چیزی باشه:
در این کد متغیر before یه متغییری هست که می دونیم که از نوع type هست، و متغیر after یه متغیری که می خواهیم اون رو cast کنیم، اما ایرادی که هست اینه که type در لیست cast بعد از as نمی آید.



Type type=Type.GetType ("typeName");
before = after as type;

prankster
چهارشنبه 09 اردیبهشت 1388, 14:38 عصر
Type متغيري است كه در runtime مقدار دارد، شما در زمان compile مي خواهيد از آن استفاده كنيد!

كمي گنگ به نظر مي رسد! اگر نوع object را مي دانيد كه از cast كردن ساده مي توانيد استفاده كنيد، اگر در زمان اجر مي خواهيد يك نوع dynamic ايجاد كنيد با دستور بالا قابل اجرا است. در هر حال هرگز نمي توانيد Type از نوع مورد نظر در زمان compile داشته باشيد.
با استفاده از Activator مي توانيد از يك Type كه آن را به صورت dynamic ايجاد كرده اين يك نمونه بسازيد

مثلا:


StringBuilder str1 = new StringBuilder("test");

StringBuilder str2 = (StringBuilder)Activator.CreateInstance(Type.GetTy pe("System.Text.StringBuilder"));
str2.Append(str1);

Console.Write(str2);

AmirAlimadadi
چهارشنبه 09 اردیبهشت 1388, 15:04 عصر
ببینید من نمی خوام که شی درست کنم، من می خوام که یه شی از نوع string رو به یه نوع دیگه تبدیل(cast) کنم، منتها مشکل اینجاست که نام این نوع در یه database به صورت رشته (string) ذخیره شده، حالا من نمی تونم از این رشته استفاده کنم و عملیات تبدیل رو انجام بدم. یعنی مثلا من می خوام "123" رو به int تبدیل کنم، منتها کلمه System.Int32 در پایگاه داده به صورت رشته ذخیره شده، من نمی دونم چه طور باید از این کلمه ذخیره شده در پایگاه داده به عنوان یه type استفاده کنم و متغیر رو به اون cast کنم، فکر کنم که توضیحات باید کامل بوده باشه.
اینم بگم که من مطمئن هستم که این cast قابل اجراست یعنی error نمی گیره.

prankster
چهارشنبه 09 اردیبهشت 1388, 16:07 عصر
تنها در زمان اجرا است كه شما مي توانيد object مورد نظر از جنس string را به Type ذخيره شده از جنس string تبديل كنيد و اين تبديل تنها به متغير از جنس Object قابل اجرا است:


string stringObject = "123";
string stringType = "System.Int32";

Type actualType = Type.GetType(stringType, false, true);
object actualObject = Convert.ChangeType(stringObject, actualType);


actualObject از جنس Int32 است، گرچه در ظرف Object ريخته شده است، در هر حال اگر تعداد Type هاي ذخيره شده محدود است بعد از كد بالا مي توانيد با swicth-case ساده
actualObject را به Type اصلي cast كنيد

NewFoxStudent
چهارشنبه 09 اردیبهشت 1388, 16:09 عصر
توی فضای نام Reflection دنبالش بگرد
به عنوان مثال کلاس Assembly از یک رشته که نام فرمه میتونه نمونه ای از فرم بسازه
شما باید اول یه نمونه از کلاسی که Type مشخص شده بسازید و بعد نام اون نمونه رو برابر رشته ای قرار بدید که ذخیره کردید