Я имею ниже части кода, который выполняет итерации посредством средств управления на веб-странице и где это - imagebutton, это изменяет imageUrl свойство. То, что я хотел бы, чтобы это сделало, проходят каждое управление и, если то управление, оказывается, имеет imageUrl свойство, то сделайте изменение. Например, нормальные изображения и т.д. были бы включены в процесс. Я получаю чувство, что дженерики или что-то могли бы быть ключом здесь, но я не являюсь сведущим в той области по меньшей мере. Какие-либо мысли?Спасибо!
public static void AddThemePathToImages(Control Parent)
{
foreach (Control c in Parent.Controls)
{
ImageButton i = c as ImageButton;
if (i != null)
{
// See if theme specific version of this file exists. If not, point it to normal images dir.
if (File.Exists(System.Web.HttpContext.Current.Server.MapPath("~/App_Variants/" + GetUserTheme().ToString() + "/images/" + i.ImageUrl)))
{
i.ImageUrl = "~/App_Variants/" + GetUserTheme().ToString() + "/images/" + i.ImageUrl;
}
else
{
i.ImageUrl = "~/images/" + i.ImageUrl;
}
}
if (c.HasControls())
{
AddThemePathToImages(c);
}
}
}
Вы не дженерики не нужны, подойдет обычное наследование:
Поскольку ImageButton просто наследует ImageUrl от своего родительского класса Image , вы можете просто изменить свой первый бит от:
ImageButton i = c as ImageButton;
до:
Image i = c as Image;
Тогда он будет работать нормально как для Image, так и для ImageButton
Теперь, если вы хотите, чтобы он работал для любых элементов управления, у которых есть свойство ImageUrl (даже для некоторых настраиваемых элементов управления, которые не ' t унаследовано от Image), вам нужно будет использовать отражение, чтобы увидеть, имеет ли объект свойство ImageUrl, и если да, используйте его.
Я бы подумал о создании подкласса настраиваемого элемента управления «ThemedImageButton» , который может инкапсулировать код для установки правильного ImageUrl для каждого изображения.
Вы можете добавить переопределение OnPreRender, чтобы проверить наличие изображения и обновить свойство.
Затем вы можете выполнить простой поиск и замену в своем проекте, чтобы заменить
public class ThemedImageButton : ImageButton
{
protected override OnPreRender(EventArgs e)
{
// See if theme specific version of this file exists. If not, point it to normal images dir.
if (File.Exists(System.Web.HttpContext.Current.Server.MapPath("~/App_Variants/" + GetUserTheme().ToString() + "/images/" + i.ImageUrl)))
{
i.ImageUrl = "~/App_Variants/" + GetUserTheme().ToString() + "/images/" + i.ImageUrl;
}
else
{
i.ImageUrl = "~/images/" + i.ImageUrl;
}
}
}
Вы также можете предоставить такое же решение для элементов управления
Если у вас нет набора свойств, я думаю, что imageUrl будет пустой или пустой строкой. Попробуйте сформулировать это в формулировке «если». Думаю, это решит вашу проблему.