[英]Type Casting in c#
我在声明从参数类型变量传递的类型时遇到问题。
public static void ShowThisForm(Type passXtraForm, Form parent)
{
var xfrm = passXtraForm.GetType();
xfrm xfrmName = new xfrm();
xfrmName.Show();
}
我可以从passXtraForm.GetType()中将变量声明为类型并将其声明为另一个变量吗? 只是将表单的类型传递给另一个类。
预先感谢您的答复。
您可以为此使用泛型:
public static void ShowThisForm<T>(T passXtraForm, Form parent) where T : Form, new()
{
T xfrmName = new T();
xfrmName.Show();
}
在这种情况下,类型参数将限制为Form类型以及从Form派生的类型。 无论如何, 为什么要使用这种方法? Form和Application静态类中还有其他方法可以在您的应用程序中查找表单...
首先,它看起来好像不需要parent
参数。 我会完全消除它。 然后,我将使用泛型来完成您要完成的任务:
public static void ShowThisForm<T>() where T : Form, new()
{
T xfrmName = new T();
xfrmName.Show();
}
此代码的where T : Form, new()
部分称为类型约束 ,它阻止您使用没有默认构造函数的类型调用ShowThisForm
方法并从Form
派生。
通过指示T
必须具有默认构造函数,编译器知道如何解析new T()
; 通过指示T
从Form
派生的,编译器知道如何调用.Show()
方法。
因此,如果您有一个名为MyForm
的表单类,则可以使用以下语法来调用此方法:
ShowThisForm<MyForm>();
有关更多文档,您应该在MSDN上查看以下文章:
您可以将其更改为以下形式:
public static void ShowThisForm<T>() where T : Form, new()
{
T xfrmName = new T();
xfrmName.Show();
}
也许传入工厂 ,以便一个已知的接口可以实例化调用代码认为必需的任何类型的对象?
(下面的代码是我在此处输入的快速示例;格式化已关闭,设计可能会更好。这只是一个想法)
static class XFactory
{
private int _id;
public XFactory(int formId) {
_id = formId;
}
/// <summary>
/// Decides which class to instantiate.
/// </summary>
public static Form Get()
{
switch (_id)
{
case 0:
return new FormA();
case 1:
case 2:
return new FormB();
case 3:
default:
return new FromC();
}
}
}
public static void Main()
{
ShowThisForm(new XFactory(2));
}
public static void ShowThisForm(XFactory formFactory)
{
var xfrm = formFactory.Get();
xfrm.Show();
}
您可以通过反射和Activator.CreateInstance(typ,Constructorargs)实例化一个类/类型,但是最有可能在其他地方创建该对象并使其属于已知基类(在您的情况下,看起来像形式)会更好。 ,或让它实现可用于对其进行操作的已定义接口。 您很少需要创建完全未知类型的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.