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

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

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

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

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

14.08.2008 11:30:54
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

20
14.08.2008 11:33:21
А если у вас есть 3 формы? Я хочу Form3: Form2. Это включает в себя параметр общего типа + элементы управления в Form2. Есть идеи?
mynkow 23.09.2010 21:07:37

У меня есть способ обойти это, что работает, но не идеально:

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

internal class MyGenericForm:
    MyGenericForm<object> { }

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

0
14.08.2008 11:32:45

Вы можете сделать это в три этапа.

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
{
}    
0
25.07.2019 10:57:54
1) это только 2 шага и б) все в нем *.Designer.cs
Keith 23.07.2019 14:54:17
Во время работы это не вызывает никаких проблем, но форма является проблематичной на этапе проектирования. Для этого System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager (typeof (Form1 <TEntity, TContext>)); После редактирования строки ее необходимо добавить снова.
Ali Osman Yavuz 24.07.2019 10:58:24
Да, это моя точка зрения - VS может отменить вашу работу в любое время и полагаться на ручной процесс, чтобы исправить это, каждый раз просто запрашивая ошибки. В какой-то момент вы (или кто-то, работающий с вашим кодом) забудете, и вы получите ошибку во время выполнения, потому что не может найти ресурс.
Keith 24.07.2019 14:30:31
Добавил новый частичный файл класса Form1 {}, его работа открыта дизайнером.
Ali Osman Yavuz 24.07.2019 20:09:44

Если палеолитический код не боится вас

    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);
0
4.02.2020 09:03:29