如何编写一个泛型方法来初始化传递给该方法的类型

本文关键字:方法 类型 初始化 何编写 泛型方法 一个 | 更新日期: 2023-09-27 17:52:46

我有一个类,它通过只有GET的属性来保存其他类的实例。

public class PageInstance : PageInstanceBase
{
    #region Private Members
    private InquiryPage _inquiryPage;
    #endregion
    #region Properties
    /// <summary>
    /// Get Inquiry Page.
    /// </summary>
    public InquiryPage InquiryPage
    {
        get
        {
            if (this._inquiryPage == null)
            {
                this._inquiryPage = new InquiryPage();
            }
            return this._inquiryPage;
        }
    }

}

这个类有10多个属性(10个不同的类实例)。现在我想写一个显式的方法,我可以根据需要设置值,我不想在现有的属性中使用SET。

是否有可能用泛型方法或其他方法来实现?像…

public void Refresh<T>() where T : new()
    {
       _inquiryPage = new T();
    }

我被困在这个地方。如有任何帮助,不胜感激。

谢谢,

Sham_

如何编写一个泛型方法来初始化传递给该方法的类型

您可以指定某些constraint,但对于某些抽象,如interfaceabstract class。示例:

public void Refresh<T>() 
    where T : InquiryPage, new()
{
    _inquiryPage = new T();
}

在你的情况下,我不知道InquiryPage类型是什么,但是,如果你有一些抽象,你可以使用这个方法,并保持new()对CLR说,这个T泛型也必须有一个空的构造函数。

或者,使您的类泛型,例如:

public class PageInstance<T> : PageInstanceBase, 
    where T : new()           
{
    #region Private Members
    private T _inquiryPage;
    #endregion
    #region Properties
    public T InquiryPage
    {
        get
        {
            if (this._inquiryPage == null)
            {
                this._inquiryPage = new T();
            }
            return this._inquiryPage;
        }
    }
    public void Refresh() 
    {
       this._inquiryPage = new T();
    }
}

在泛型中,您只需在T类型中使用约束中指定的内容,在本例中为空构造函数。

最后,我找到了如下所述的解决方案。但是,这导致我为所有属性提供私有/受保护的SET属性。约束,Page已经被继承到PageInstanceBase,然后再继承到PageInstance。

    /// <summary>
    /// Refresh the Page.
    /// </summary>
    /// <typeparam name="T">Page.</typeparam>
    public void Refresh<T>() where T : Page, new()
    {
        Type t = typeof(T);
        PropertyInfo pi = this.GetType().GetProperty(t.Name);
        pi.SetValue(this, new T(), null);
    }

现在调用时,我将调用页面为Refresh(),它设置this。_inquiryPage到InquiryPage类的新实例

谢谢,

Sham_