我需要获取MasterPage的ContentPlaceHolders列表,但属性
protected internal IList ContentPlaceHolders { get; }
受内部保护,因此我们无法访问它们。
我们有什么方法可以从MasterPage(包括Reflection)中提取它们吗?感谢。
答案 0 :(得分:2)
如果您不介意使用反射,并且不介意在迁移到较新版本的.NET时应用程序崩溃的风险,这将有效:
IList placeholderNames =
typeof(MasterPage).GetProperty("ContentPlaceHolders",
BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(myMasterPage, null) as IList;
答案 1 :(得分:2)
您可以递归循环遍历Master.Controls并检查每个控件以查看它是否属于ContentPlaceHolder类型。
private readonly IList<ContentPlaceHolder> _contentPlaceHolders = new List<ContentPlaceHolder>();
private void FindContentPlaceHolders(ControlCollection controls)
{
foreach(Control control in controls)
{
if (control is ContentPlaceHolder)
{
_contentPlaceHolders.Add((ContentPlaceHolder) control);
return;
}
FindContentPlaceHolders(control.Controls);
}
}
答案 2 :(得分:1)
作为Daniel答案的变体,您可以将其作为MasterPage
上的扩展方法来写:
public static IEnumerable<ContentPlaceHolder>
GetContentPlaceHolders(this MasterPage master)
{
return GetAllControlsInHierarchy(master)
.OfType<ContentPlaceHolder>();
}
private static IEnumerable<Control> GetAllControlsInHierarchy(
Control control)
{
foreach (var childControl in control.Controls)
{
yield return childControl;
foreach (var childControl in
GetAllControlsInHierarchy(childCOntrol))
{
yield return childControl;
}
}
}