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

时间:2014-03-25 03:02:27

标签: c#

我有一个类,它通过只有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();
    }

我被困在这个地方。任何帮助都非常感谢。

谢谢,

深水_

2 个答案:

答案 0 :(得分:0)

你可以像你一样指定一些constraint,但对于像interfaceabstract class这样的一些abstration。样本:

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

在您的情况下,我不知道InquiryPage类型是什么,但是,如果您有一些abstration,您可以使用此方法并让new()向CLR说明{{1}泛型类型也必须有一个空构造函数。

或者,对于样本:

,使你的classe是通用的
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(); } } 类型,你在约束中指定了什么,在这种情况下,是一个空的构造函数。

答案 1 :(得分:0)

最后,我能够找到下面提到的解决方案。但是,这导致我为所有属性提供私有/受保护的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&lt; InquiryPage&gt;(),将this._inquiryPage设置为新的InquiryPage实例类。

谢谢,

深水_