Подмножество общего абстрактного списка - C # - PullRequest
0 голосов
/ 30 декабря 2010

Я делаю некоторые абстрактные базовые классы. Базовый объект определяется как:

    public abstract class Bar
    {
        public bool Enabled;
    }

Базовая коллекция определяется как:

 public abstract class Foo<T> : List<T>
        where T : Bar
    {
        public Foo<T> GetAllEnabled()
        {
            Foo<T> ret = new Foo<T>();

            foreach (T item in this)
            {
                if (item.Enabled)
                {
                    ret.Add(item);
                }
            }

            return ret;
        }
    }

Естественно, я получаю ошибку, пытаясь создать new Foo<T>(), потому что Foo - абстрактный класс. Без абстрактного модификатора все работает нормально, но я хочу, чтобы модификатор был там, потому что я хочу убедиться, что класс получен.

Я пытался

<code>     Type U = this.GetType();
        Foo ret = new U();
но я получаю сообщение об ошибке «Не удалось найти тип или имя пространства имен« U »(бла-бла-бла)».

Я думаю, что моя попытка исправить должна сработать, и у меня просто неверный синтаксис. Что мне здесь не хватает?

Ответы [ 4 ]

2 голосов
/ 30 декабря 2010
Type U = this.GetType();
Foo ret = new U();

Type U будет содержать информацию о типе данных, она не эквивалентна параметру универсального типа, который можно затем создать. Вы можете использовать U для создания типа через Activator.CreateInstance, который имеет несколько перегрузок и принимает Type объекты, но тогда вам остается необходимость привести полученный объект к соответствующему типу, чтобы иметь возможность используйте это.

Type type = this.GetType();
Foo<T> ret = (Foo<T>)Activator.CreateInstance(type);
1 голос
/ 30 декабря 2010

Конечно, ошибочно создавать экземпляр абстрактного класса Foo<T>. Это прямое следствие абстрактности.

но мне нужен модификатор [abstract], потому что я хочу убедиться, что класс получен.

Затем сначала получите его, class Foo2<T> : Foo<T> { }, а затем создайте экземпляр Foo2<T>.

1 голос
/ 30 декабря 2010
but I want the modifier there because I want to make sure the class gets derived.

Согласно вашим собственным словам, вам нужно будет создать класс, который вы затем сможете создать.

0 голосов
/ 30 декабря 2010

А какой тип вы хотите создать?Что вы на самом деле пытаетесь достичь?Почему вы вынуждены наследовать от своего класса коллекции?Вам не нужно, чтобы коллекция была абстрактной, если вы хотите, чтобы ее элементы были абстрактными.Особенно с дженериками.

Также: http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/585476.aspx (я думаю, что есть гораздо лучшая статья, но я не могу ее найти)

...