如何定义具有类型作为值的 属性

How to define a property that has a type as a value

我想在 class 中定义一个 属性(名为 FormAbout),以便使用此对象的人可以分配 IFormAbout 的派生类型。为此,我有一个接口及其实现:

public interface IFormAbout : IDisposable
{
    void ShowAbout();
}

public partial class MyFormAbout : Form, IFormAbout
{
    public void ShowAbout()
    {
        base.ShowDialog();
        // ...
    }

    // ...
}

在这里,主要的 Form 和 属性 我想定义:

public partial class FormMain : Form
{
    // --- This is what I don't know how to do --- //
    public Type<IFormAbout> FormAbout { get; set; }
    // ------------------------------------------- //

    private void SomeMethod()
    {
        using (FormAbout frm = new FormAbout())
        {
            frm.ShowAbout();
            // ...
        }
    }
}

属性 会像这样设置:

formMain1.FormAbout = typeof(MyFormAbout);

可以吗?提前致谢。

尽管您可以 有一个 属性 类型 Type,但这不是您想要的。您只想将 MyFormAbout 的新实例分配给 属性,不是吗?所以 属性 的类型变成 IFormAbout:

public partial class FormMain : Form
{
    public IFormAbout FormAbout { get; set; }

    private void SomeMethod()
    {           
        FormAbout.ShowAbout();
        // ...
    }
}

现在你不需要分配一个类型,而是一个它的具体实例:

FormMain1.AboutForm = new MyAboutForm();
formMain1.SomeMethod(); // this will use the aboutForm from above

终于找到解决问题的好办法了,分享给大家。 通过将我的 class FormMain 声明为通用的,可以设置 IFormAbout 的显式实现而不实例化它:

public partial class FormMain<About> : Form where About : IFormAbout
{
    private void SomeMethod()
    {
        using (About frm = Activator.CreateInstance<About>())
        {
            frm.ShowAbout();
            // ...
        }

        // ...
    }
}

然后,我们只需要像这样声明一个 FormMain 的实例:

FormMain<MyFormAbout> frm = new FormMain<MyFormAbout>();

足以满足我的目的。