Вы должны быть в состоянии создать общую форму:
public partial class MyGenericForm<T> :
Form where T : class
{
/* form code */
public List<T> TypedList { get; set; }
}
Действителен C #, и компилируется. Однако конструктор не будет работать, и форма выдаст исключение времени выполнения, если у вас есть изображения, указывающие, что он не может найти ресурс.
Я думаю, это потому, что конструктор форм Windows предполагает, что ресурсы будут храниться под именем простого типа.
Да, ты можешь! Вот сообщение в блоге, которое я сделал некоторое время назад с уловкой:
Изменить: Похоже, вы уже делаете это таким образом. Этот метод работает хорошо, поэтому я не считаю его слишком хакерским.
У меня есть способ обойти это, что работает, но не идеально:
Добавьте в проект новый класс, который наследует форму с ее простым именем.
internal class MyGenericForm:
MyGenericForm<object> { }
Это означает, что, хотя разработчик все еще не прав, ожидаемый простой тип (т.е. без <>
) все еще найден.
Вы можете сделать это в три этапа.
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
{
}
*.Designer.cs
Если палеолитический код не боится вас
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);