PDA

View Full Version : تبدیل یک شی به یک لیست نا مشخص



ronix3
چهارشنبه 27 اسفند 1399, 19:17 عصر
سلام
من یه شی دارم که توش یه لیست از یه کلاس هست چطور می شه به آیتم های این لیست دسترسی پیدا کنم


مثلا کد زیر رو در نظر بگیرید


List<Company> lico = new List<Company>();
Company co = new Company();
co.Name = "sss";
co.Discription = "fghf";
lico.Add(co);

object obj = lico;
foreach (var v in obj)
{

}


البته این یه مثاله در حالت اجرا نوع لیست مشخص می شه و من نمی ذونم از چه کلاسی لیست گرفته شده و در obj ریخته شده
چطور می تونم به آیتم های لیست دسترسی پیدا کنم؟

the king
چهارشنبه 27 اسفند 1399, 20:45 عصر
سلام
من یه شی دارم که توش یه لیست از یه کلاس هست چطور می شه به آیتم های این لیست دسترسی پیدا کنم


مثلا کد زیر رو در نظر بگیرید


List<Company> lico = new List<Company>();
Company co = new Company();
co.Name = "sss";
co.Discription = "fghf";
lico.Add(co);

object obj = lico;
foreach (var v in obj)
{

}


البته این یه مثاله در حالت اجرا نوع لیست مشخص می شه و من نمی ذونم از چه کلاسی لیست گرفته شده و در obj ریخته شده
چطور می تونم به آیتم های لیست دسترسی پیدا کنم؟
این object ها ویژگی مشترک دارند یا کلا هر کلاس ساز خودش رو میزنه و فرضا Name و Discription (یا احیانا Description) مختص اون Company ئه و در object های نوع دیگه نیست؟

ببینید این الگو ها رو می پسندید؟

object obj = lico;
foreach (var v in (IEnumerable<object>) obj)
{
if (v is Company)
{
var c = (Company)v;
var name = c.Name;
var d = c.Discription;
}
}



object obj = lico;
foreach (var v in (IEnumerable<object>)obj)
{
var company = v as Company;
if (company != null)
{
var name = company.Name;
var d = company.Discription;
}
}


اگر ویژوال استدیو تون قدیمی نباشه اینجور pattern ها رو هم میشه نوشت :

object obj = lico;
foreach (var v in (IEnumerable<object>)obj)
{
if (v is Company company)
{
var name = company.Name;
var d = company.Discription;
}
}



object obj = lico;
foreach (var v in (IEnumerable<object>)obj)
{
switch (v)
{
case Company company:
{
var name = company.Name;
var d = company.Discription;
break;
}
}
}

ronix3
پنج شنبه 28 اسفند 1399, 11:10 صبح
از این کد ها نمی تونم استفاده کنم چون به نوع کلاسی که لیست شده دسترسی ندارم ممکن هر کلاسی باشه
از کد


var v= (List<object>)obj;

استفاده کردم برنامه اجرا می شه ولی می گه این لیست به object قابل تبدیل نیست

هدف من از این کار اینه که یه لیست از یه کلاس نامشخص رو که ممکن تو این کلاس هم یه لیست از یه کلاس نامشخص دیگه باشه رو به xml تبدیل کنم
حالا مشکل اینجاست که با استفاده از GetProperties)( یه object از لیست به من داده می شه و من نمی دونم این لیست از چه کلاسی گرفته شده تا تبدیل به لیست کنم و آیتم های درون لیست رو هم بگیرم و به xml تبدیل کنم

این کلاس ها رو خودم می سازم اگه نیاز باشه می تونم هر ویژگی اضافه کنم ولی فک نکنم نیاز باشه چون می تونم کلاس ها رو از هم تشخیص بدم ولی چون این کلاس ها تو یه پروژه نیستن به نوع کلاس دسترسی ندارم

the king
پنج شنبه 28 اسفند 1399, 22:08 عصر
از این کد ها نمی تونم استفاده کنم چون به نوع کلاسی که لیست شده دسترسی ندارم ممکن هر کلاسی باشه
از کد


var v= (List<object>)obj;

استفاده کردم برنامه اجرا می شه ولی می گه این لیست به object قابل تبدیل نیست

هدف من از این کار اینه که یه لیست از یه کلاس نامشخص رو که ممکن تو این کلاس هم یه لیست از یه کلاس نامشخص دیگه باشه رو به xml تبدیل کنم
حالا مشکل اینجاست که با استفاده از GetProperties)( یه object از لیست به من داده می شه و من نمی دونم این لیست از چه کلاسی گرفته شده تا تبدیل به لیست کنم و آیتم های درون لیست رو هم بگیرم و به xml تبدیل کنم

این کلاس ها رو خودم می سازم اگه نیاز باشه می تونم هر ویژگی اضافه کنم ولی فک نکنم نیاز باشه چون می تونم کلاس ها رو از هم تشخیص بدم ولی چون این کلاس ها تو یه پروژه نیستن به نوع کلاس دسترسی ندارم
چرا میخواهید به List تبدیلش کنید؟ به <List<object تبدیل نکنید چون <List<object یک نوع خاص از List ئه، نه List از هر نوعی، شبیه foreach ای که نوشتم از <IEnumerable<object یا IEnumerable استفاده کنید. اگر هم میخواهید حتما شبیه List باهاش رفتار کنید به IList تبدیلش کنید، اگر List از هر نوعی باشه IList ئه :

var v = (IList)obj;
foreach (var item in v)
{
if (item is IList)
{

}
else
{

}
}

ronix3
شنبه 30 اسفند 1399, 02:26 صبح
IList رو امتحان کرده بودم می گه حتما بابد نوع کلاس مشخص باشه
با

var list = (IEnumerable<object>)obj;

حل شد
چون به

var v= (List<object>)obj

گیر داده بود و شی لیست بود دیگه اینو امتحان نکرده بودم
ممنون که وقت گذاشتید

Mahmoud.Afrad
شنبه 30 اسفند 1399, 17:48 عصر
از این کد ها نمی تونم استفاده کنم چون به نوع کلاسی که لیست شده دسترسی ندارم ممکن هر کلاسی باشه
از کد


var v= (List<object>)obj;

استفاده کردم برنامه اجرا می شه ولی می گه این لیست به object قابل تبدیل نیست

هدف من از این کار اینه که یه لیست از یه کلاس نامشخص رو که ممکن تو این کلاس هم یه لیست از یه کلاس نامشخص دیگه باشه رو به xml تبدیل کنم
حالا مشکل اینجاست که با استفاده از GetProperties)( یه object از لیست به من داده می شه و من نمی دونم این لیست از چه کلاسی گرفته شده تا تبدیل به لیست کنم و آیتم های درون لیست رو هم بگیرم و به xml تبدیل کنم

این کلاس ها رو خودم می سازم اگه نیاز باشه می تونم هر ویژگی اضافه کنم ولی فک نکنم نیاز باشه چون می تونم کلاس ها رو از هم تشخیص بدم ولی چون این کلاس ها تو یه پروژه نیستن به نوع کلاس دسترسی ندارم

این کلاسهای مشترک بین چند پروژه رو به یک پروژه جدید منتقل کنید. در پروژه های دیگر هم رفرنس بدید به این پروژه.