Ограничить публичную собственность определенными типами в Списке <Type> - PullRequest
2 голосов
/ 18 апреля 2011

Мой первоначальный вопрос должен был быть в основном идентичен Тип привязки к конкретным типам .

То, чего я хочу достичь, это, в основном, это.

public List<Type> MyPublicProperty { get; set; } where T IMyCustomInterface

Теперь, читая вышеупомянутый вопрос, я вижу, что это, очевидно, невозможно.

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

Так что в основном меня интересует, какова альтернатива (помимо проверки типа во время выполнения, когда свойство установлено) для такого свойства (если оно существует)?

РЕДАКТИРОВАТЬ: предлагаемое решение не работает.

Я получаю код, который выглядит следующим образом:

public class CustomSerializableTypeList<T> : List<T> where T : ITcpSerializable
{

}

CustomSerializableTypeList<Type> myCustomTypes = new CustomSerializableTypeList<Type>();

И получите следующую ошибку:

Тип «System.Type» не может быть использован как параметр типа 'T' в общем тип или метод 'CustomSerializableTypeList. Там нет неявного преобразования ссылок от 'System.Type' к 'ITcpSerializable'.

Ошибка имеет смысл, когда я смотрю и думаю о предложенной обобщенной реализации.

Должен быть способ обойти это.

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

Я думаю, вам понадобится ваша собственная реализация списка, которая обернет List<Type>. Может быть, что-то вроде этого:

public class TypeList<T> where T : class
{
    private readonly List<Type> list = new List<Type>();

    public void Add(Type item)
    {
        if(!typeof(T).IsAssignableFrom(item))
        {
            throw new InvalidOperationException();
        }

        list.Add(item);
    }
}

Конечно, вы, вероятно, захотите реализовать IList<Type>, а затем просто делегировать методы list.

1 голос
/ 19 апреля 2011

Обратите внимание: я не собираюсь предоставлять список экземпляров, которые реализуют определенный тип.Я хочу предоставить Список типов, которые реализуют определенный интерфейс.

Нет быстрого и простого способа сделать это.Вам нужно будет реализовать свой собственный класс коллекции, переопределить метод add, а затем проверить, реализует ли тип ваш интерфейс с помощью отражения ...

class myTypeCollection : List<System.Type>
{
    override void Add(Type t)
    {
        if (t.GetInterface(typeof(MyCustomInterface)) == null)
            throw new InvalidOperationException("Type does not implement MyCustomInterface");

        base.Add(t);
    }
}
1 голос
/ 18 апреля 2011

Вы можете определить новый тип коллекции CustomList<T>, который наследуется от List<T> и добавляет ограничение типа, а затем использовать его вместо List<Type> в вашем классе.

public class CustomList<T> : List<T> where T : ICustomInterface {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...