c#中的类型转换

本文关键字:类型转换 | 更新日期: 2023-09-27 18:10:25

我在声明类型作为参数类型变量传递时有一个问题。

public static void ShowThisForm(Type passXtraForm, Form parent)
    {
        var xfrm = passXtraForm.GetType();
        xfrm xfrmName = new xfrm();
        xfrmName.Show();
    }

我可以从passXtraForm.GetType()中将变量声明为类型并将其声明为另一个变量吗?只是将表单的类型传递给另一个类。

提前感谢您的回复。

c#中的类型转换

你可以使用泛型:

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(type, constructorargs),但最有可能的是,最好在其他地方创建对象,并让它属于已知的基类(在您的情况下,它看起来像form),或者让它实现可用于操作它的定义接口。很少需要创建完全未知类型的对象。