এরিকের দুর্দান্ত ব্যাখ্যাটি উদ্ধৃত করা
কি ঘটেছে? আপনি কি জিরাফের তালিকাতে একটি বাঘ থাকতে চান? আপনি কি একটি ক্রাশ চান? বা আপনি কি সংকলকটি প্রথমে অ্যাসাইনমেন্টটি বেআইনী করে ক্র্যাশ থেকে রক্ষা করতে চান? আমরা পরেরটি নির্বাচন করি।
তবে আপনি যদি একটি সংকলন ত্রুটির পরিবর্তে রানটাইম ক্র্যাশ বেছে নিতে চান? আপনি সাধারণত কাস্ট <> বা কনভার্টআল <> ব্যবহার করেন তবে তার পরে আপনার 2 টি সমস্যা হবে: এটি তালিকার একটি অনুলিপি তৈরি করবে। আপনি যদি নতুন তালিকায় কিছু যুক্ত করেন বা সরিয়ে থাকেন তবে এটি মূল তালিকায় প্রতিফলিত হবে না। এবং দ্বিতীয়ত, এটি বিদ্যমান অবজেক্টগুলির সাথে একটি নতুন তালিকা তৈরি করার পরে একটি বড় কর্মক্ষমতা এবং মেমরি পেনাল্টি রয়েছে।
আমার একই সমস্যা ছিল এবং তাই আমি একটি মোড়কের ক্লাস তৈরি করেছি যা সম্পূর্ণ নতুন তালিকা তৈরি না করে জেনেরিক তালিকা castালতে পারে।
মূল প্রশ্নে আপনি তখন ব্যবহার করতে পারেন:
class Test
{
static void Main(string[] args)
{
A a = new C(); // OK
IList<A> listOfA = new List<C>().CastList<C,A>(); // now ok!
}
}
এবং এখানে মোড়কের ক্লাস (+ সহজ ব্যবহারের জন্য একটি এক্সটেনশন পদ্ধতি কাস্টলিস্ট)
public class CastedList<TTo, TFrom> : IList<TTo>
{
public IList<TFrom> BaseList;
public CastedList(IList<TFrom> baseList)
{
BaseList = baseList;
}
// IEnumerable
IEnumerator IEnumerable.GetEnumerator() { return BaseList.GetEnumerator(); }
// IEnumerable<>
public IEnumerator<TTo> GetEnumerator() { return new CastedEnumerator<TTo, TFrom>(BaseList.GetEnumerator()); }
// ICollection
public int Count { get { return BaseList.Count; } }
public bool IsReadOnly { get { return BaseList.IsReadOnly; } }
public void Add(TTo item) { BaseList.Add((TFrom)(object)item); }
public void Clear() { BaseList.Clear(); }
public bool Contains(TTo item) { return BaseList.Contains((TFrom)(object)item); }
public void CopyTo(TTo[] array, int arrayIndex) { BaseList.CopyTo((TFrom[])(object)array, arrayIndex); }
public bool Remove(TTo item) { return BaseList.Remove((TFrom)(object)item); }
// IList
public TTo this[int index]
{
get { return (TTo)(object)BaseList[index]; }
set { BaseList[index] = (TFrom)(object)value; }
}
public int IndexOf(TTo item) { return BaseList.IndexOf((TFrom)(object)item); }
public void Insert(int index, TTo item) { BaseList.Insert(index, (TFrom)(object)item); }
public void RemoveAt(int index) { BaseList.RemoveAt(index); }
}
public class CastedEnumerator<TTo, TFrom> : IEnumerator<TTo>
{
public IEnumerator<TFrom> BaseEnumerator;
public CastedEnumerator(IEnumerator<TFrom> baseEnumerator)
{
BaseEnumerator = baseEnumerator;
}
// IDisposable
public void Dispose() { BaseEnumerator.Dispose(); }
// IEnumerator
object IEnumerator.Current { get { return BaseEnumerator.Current; } }
public bool MoveNext() { return BaseEnumerator.MoveNext(); }
public void Reset() { BaseEnumerator.Reset(); }
// IEnumerator<>
public TTo Current { get { return (TTo)(object)BaseEnumerator.Current; } }
}
public static class ListExtensions
{
public static IList<TTo> CastList<TFrom, TTo>(this IList<TFrom> list)
{
return new CastedList<TTo, TFrom>(list);
}
}