Можете ли вы использовать общие формы в C#?

У вас должна быть возможность создать общую форму:

public partial class MyGenericForm<T> :
    Form where T : class
{
    /* form code */
    public List<T> TypedList { get; set; }
}

Действительно C#, и компилируется. Однако дизайнер не будет работать, и форма выдаст исключение времени выполнения, если у вас есть изображения, указывающие, что он не может найти ресурс.

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

Ответов (4)

Решение

Да, ты можешь! Вот сообщение в блоге, которое я недавно сделал с трюком:

Разработка общих форм

Изменить: похоже, вы уже делаете это таким образом. Этот метод работает нормально, поэтому я бы не стал считать его слишком хакерским.

Вы можете сделать это за три шага.

1) Заменить в файле Form1.cs

public partial class Form1<TEntity, TContext> : Formbase // where....

2) Заменить в Form1.Designer.cs

 partial class Form1<TEntity, TContext>

3) Создайте новый файл: Form1.Generic.cs (для открытия дизайна)

partial class Form1
{
}    

Если палеолитический код вас не пугает

    public  static MyForm GetInstance<T>(T arg) where T : MyType
{
    MyForm myForm = new MyForm();

    myForm.InitializeStuffs<T>(arg);
    myForm.StartPosition = myForm.CenterParent;

    return myForm;
}

Используй это

var myFormInstance = MyForm.GetInstance<T>(arg);                                                                      myFormInstance.ShowDialog(this);

У меня есть обходной прием, который работает, но не идеален:

Добавьте в проект новый класс, наследующий форму с простым именем.

internal class MyGenericForm:
    MyGenericForm<object> { }

Это означает, что хотя разработчик все еще ошибается, ожидаемый простой тип (то есть без <> ) все еще найден.