Нет, это не работает. Параметрические типы универсальной коллекции (или других универсальных) в C# должны быть объявляемыми типами, а атрибуты существуют только как метаданные.
У вас не может быть объекта типа FooAssignable. У вас может быть объект с атрибутом FooAssignable, но это не то же самое, что иметь его в качестве супертипа. FooAssignable не является классом или интерфейсом и не является допустимым спецификатором типа. FooAssignableAttribute есть, но это тип, который относится к самому атрибуту, а не к элементам, помеченным этим атрибутом.
Учтите, что в словаре тип вывода для индексатора — это указанный вами тип вывода. Но у вас не может быть переменной типа FooAssignable — у вас может быть переменная типа, помеченного тегом FooAssignable, но не существует единого базового класса, подходящего для всех этих типов. Поскольку это объявление типа является недопустимым, этот Dictionary будет иметь недопустимый, несуществующий тип в качестве возвращаемого типа для получателя из его индексатора, среди многих других мест. Проверка типа C# не может быть спонтанно заменена с помощью универсальных механизмов проверкой наличия атрибута.
Все, что вы хотите, чтобы система типов проверяла для вас, должно быть частью системы типов. Оценка атрибутов не определяет типы, поэтому система типов не может сделать это за вас; между тем, дженерики — это часть языка, которая наиболее непосредственно взаимодействует с системой типов. Вам придется фактически пройти через систему типов, чтобы выполнить подобную проверку, и это означает вместо этого продвигать FooAssignableAttribute к интерфейсу (IFooAssignable?).
person
Adam Norberg
schedule
27.01.2012
{}
над полем редактирования). - person Joe White   schedule 28.01.2012