تبدیل لیست DerivedClass به لیست BaseClass در C#
فرض کنید دو کلاس به نام های DerivedClass و BaseClass تعریف کرده ایم که DerivedClass از BaseClass ارث بری می کنید. حال می خواهیم یک List<DerivedClass>
را به یک List<BaseClass>
تبدیل کنیم. اما امکان این کار به صورت مستقیم وجود ندارد. اما وقتی یک شی از نوع DerivedClass
را به یک متغیر از نوع BaseClass
نسبت میدهیم، این کار به درستی انجام میشود.
برای تبدیل یک List<DerivedClass>
به یک List<BaseClass>
، شما میتوانید از متدهایی همچون ConvertAll
یا Cast
استفاده کنید. بهعنوان مثال:
List<A> listOfA = new List<C>().ConvertAll(x => (A)x);
// یا
List<A> listOfA = new List<C>().Cast<A>().ToList();
با این حال، استفاده از این روشها به ایجاد یک لیست جدید منجر میشود و ارتباط بین لیست جدید و لیست اصلی قطع میشود. اگر شما نیاز دارید که یک لیست را بدون ایجاد یک نسخه جدید و مجزا از آن تغییر دهید، میتوانید یک کلاس wrapper برای این کار ایجاد کنید.
یک راه مناسب این است که از یک کلاس مانند کلاس CastedList
که در زیر تعریف شده استفاده کنید که قابلیت تبدیل لیستها را بدون کپی کردن آنها فراهم کند. این روش میتواند توسعهپذیری و کارایی کد شما را بهبود بخشد. به عنوان مثال:
public class CastedList<TTo, TFrom> : IList<TTo>
{
public IList<TFrom> BaseList;
public CastedList(IList<TFrom> baseList)
{
BaseList = baseList;
}
// پیادهسازی بقیه متدها برای IList<TTo>...
public static IList<TTo> CastList<TFrom, TTo>(this IList<TFrom> list)
{
return new CastedList<TTo, TFrom>(list);
}
}