我有一个类,它通过只有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();
}
我被困在这个地方。任何帮助都非常感谢。
谢谢,
深水_
答案 0 :(得分:0)
你可以像你一样指定一些constraint
,但对于像interface
或abstract 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实例类。
谢谢,
深水_