سؤال

أواجه مشكلة مع أدوية .NET العامة.الشيء الذي أريد القيام به هو حفظ مجموعة من أنواع الأدوية العامة (GraphicsItem):

public class GraphicsItem<T>
{
    private T _item;

    public void Load(T item)
    {
        _item = item;
    }
}

كيف يمكنني حفظ هذا النوع العام المفتوح في صفيف؟

هل كانت مفيدة؟

المحلول

قم بتنفيذ واجهة غير عامة واستخدم ما يلي:

public class GraphicsItem<T> : IGraphicsItem
{
    private T _item;

    public void Load(T item)
    {
        _item = item;
    }

    public void SomethingWhichIsNotGeneric(int i)
    {
        // Code goes here...
    }
}

public interface IGraphicsItem
{
    void SomethingWhichIsNotGeneric(int i);
}

ثم استخدم تلك الواجهة كعنصر في القائمة:

var values = new List<IGraphicsItem>();

نصائح أخرى

إذا كنت ترغب في تخزين GrpahicsItem غير المتجانسة، على سبيل المثال.GraphicsItem< X> وGrpahicsItem< Y> تحتاج إلى اشتقاقهما من فئة أساسية مشتركة، أو تنفيذ واجهة مشتركة.خيار آخر هو تخزينها في القائمة<object>

هل تحاول إنشاء مجموعة من GraphicsItem بطريقة غير عامة؟

لا يمكنك القيام بما يلي:

static void foo()
{
  var _bar = List<GraphicsItem<T>>();
}

ثم املأ القائمة لاحقًا.

على الأرجح أنك تحاول أن تفعل شيئا من هذا القبيل؟

static GraphicsItem<T>[] CreateArrays<T>()
{
    GraphicsItem<T>[] _foo = new GraphicsItem<T>[1];

    // This can't work, because you don't know if T == typeof(string)
    // _foo[0] = (GraphicsItem<T>)new GraphicsItem<string>();

    // You can only create an array of the scoped type parameter T
    _foo[0] = new GraphicsItem<T>();

    List<GraphicsItem<T>> _bar = new List<GraphicsItem<T>>();

    // Again same reason as above
    // _bar.Add(new GraphicsItem<string>());

    // This works
    _bar.Add(new GraphicsItem<T>());

    return _bar.ToArray();
}

تذكر أنك ستحتاج إلى مرجع نوع عام لإنشاء مصفوفة من نوع عام.يمكن أن يكون هذا إما على مستوى الطريقة (باستخدام T بعد الطريقة) أو على مستوى الفصل (باستخدام T بعد الفصل).

إذا كنت تريد أن تقوم الطريقة بإرجاع مصفوفة من GraphicsItem وGraphicsItem، فاسمح لـ GraphicsItem أن يرث من فئة أساسية غير عامة GraphicsItem وإرجاع مصفوفة من ذلك.سوف تفقد كل أنواع الأمان بالرغم من ذلك.

امل ان يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top