2009-10-20 2 views
4

У меня есть класс, объявленный как:Сложная декларация класса смущает формы дизайнера?


public class Foo<T> : Panel where T : Control, IFooNode , new() 
{ 
    ... 
} 

Я добавил его вручную, чтобы проверить это, но я в конце концов, нужно что-то, что может быть отображено в конструкторе форм. Конструктор форм не нравится, он говорит:

 
Could not find type 'FooTestNameSpace.Foo'. 
Please make sure that the assembly that 
contains this type is referenced. 
If this type is a part of your development project, make 
sure that the project has been successfully built. 

Интересно, что я также получить предупреждение, что подобное, но включает в себя универсальный тип я использовал в моем объявлении переменной. Предупреждение является:

Could not find type 'FooTestNameSpace.Foo<FooTestNameSpace.FooNodeType>'. 
Please make sure that the assembly that contains this type is referenced. 
If this type is a part of your development project, 
make sure that the project has been successfully built.

Декларация в моем простом классе Form1 является:

private FooTestNameSpace.Foo myFoo;

(FooNodeType действительно просто подкласс ярлыка, который имеет одно вспомогательное свойство не используется еще, это реализовать IFooNode).

Итак, мой вопрос ... С помощью этого типа настройки, как я могу получить Foo для отображения в дизайнере форм, или, по крайней мере, заставить его признать, что Foo является законным? Есть ли атрибут Designer, который может справиться с этим? Меня не волнует, если мой Foo-элемент управления отображается как пустой ящик, если он вообще появляется!

+2

Дизайнер хорош для простого перетаскивания вещей. Для более сложных подписей классов вы можете ожидать слишком многого. –

+0

Возможно, было бы более полезно, если бы вы также точно объяснили, что именно вы пытаетесь выполнить с этим классом, и, возможно, еще немного кода. Вполне возможно, что у вас просто отсутствует оператор using, но из вашего фрагмента невозможно сказать. –

ответ

7

Хорошо, я думаю, что у меня есть решение:



class ConcreteFooCtl : FooCtl<FooNodeType> 
{ 
} 

class FooCtl<T> : Panel where T : Control, IFooNode , new() 
{ 
} 

Проблема, кажется, что дизайнер форм не может справиться с любым общим контролем. Дизайнер форм не может обрабатывать FooCtl, но не имеет проблем с ConcreteFooCtl. Не идеальное решение, но я думаю, что он по крайней мере работоспособен. Возможно, следующая версия VS предложит пользователю указать общий тип при добавлении общего элемента управления в форму ...;)

+1

Это правильное решение этой проблемы. У меня была такая же проблема, как и год назад, и еще не нашли другого решения. –

1

Вместо того чтобы сделать Foo универсальным, вам может быть лучше сделать его не общим, а иметь общий класс, который делает то, что вам нужно. Затем вы можете делегировать всю свою обработку из формы в класс.

Смежные вопросы