如何编写一个泛型方法来初始化传递给该方法的类型
本文关键字:方法 类型 初始化 何编写 泛型方法 一个 | 更新日期: 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
,但对于某些抽象,如interface
或abstract 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
谢谢,
Sham_