C# C中对象的强制类型转换
我有一个函数,我想让它成为显示表单的通用函数。我希望函数检查表单是否已经打开,如果已经打开,则将其置于顶部,如果没有,则创建表单的新实例并显示它 检查表单是否打开的第一部分很好,但我正在从T进行强制转换,并创建一个类型为T的新表单对象。我使用这行代码创建了表单obj=Activator.CreateInstance的实例;但它并没有显示intellisense中的所有方法和属性。其中,代码形式x=新形式1。 x将显示所有的方法和属性 我肯定我做错了什么,请给我点光亮C# C中对象的强制类型转换,c#,casting,C#,Casting,我有一个函数,我想让它成为显示表单的通用函数。我希望函数检查表单是否已经打开,如果已经打开,则将其置于顶部,如果没有,则创建表单的新实例并显示它 检查表单是否打开的第一部分很好,但我正在从T进行强制转换,并创建一个类型为T的新表单对象。我使用这行代码创建了表单obj=Activator.CreateInstance的实例;但它并没有显示intellisense中的所有方法和属性。其中,代码形式x=新形式1。 x将显示所有的方法和属性 我肯定我做错了什么,请给我点光亮 private s
private static void ShowForm<T>( )
{
T obj = default( T );
List<T> opened = FormManager.GetListOfOpenForms<T>();
if ( opened.Count == 0 )
{
// not opened
// obj does not show all properties and methods
obj = Activator.CreateInstance<T>();
// x shows all properties and methods
frmLogin x = new frmLogin();
}
else
{
// opened
}
}
您需要约束T以继承表单: 一旦编译器知道T保证继承Form,就可以使用Form或其基类中定义的所有成员
对于您的问题,更一般的答案是将obj转换为表单。您需要约束T以继承表单: 一旦编译器知道T保证继承Form,就可以使用Form或其基类中定义的所有成员
对于您的问题,更一般的答案是将obj转换为Form。无参数构造函数的约束真的那么有用吗?+1@LightStriker,是的,它允许删除对CreateInstance不必要的反射调用。@AlexeiLevenkov:实际上,新的T编译为Activator.CreateInstance。该约束将运行时错误转化为编译时错误。无参数构造函数的约束真的那么有用吗?+1@LightStriker,是的,它允许删除对CreateInstance不必要的反射调用。@AlexeiLevenkov:实际上,新的T编译为Activator.CreateInstance。该约束将运行时错误转换为编译时错误。
private static void ShowForm<T>() where T : Form, new()