У меня есть приложение, которое будет загружать пользовательские элементы управления динамически в зависимости от пользователя. В приведенном ниже примере вы увидите, что я передаю каждый пользовательский элемент управления с помощью операторов switch / case. Есть лучший способ это сделать? Отражение? (Я должен иметь возможность добавить обработчик событий Bind в каждый элемент управления.)
override protected void OnInit(EventArgs e)
{
cc2007.IndividualPageSequenceCollection pages = new IndividualPageSequenceCollection().Load();
pages.Sort("displayIndex", true);
foreach (IndividualPageSequence page in pages)
{
Control uc = Page.LoadControl(page.PageName);
View view = new View();
int viewNumber = Convert.ToInt32(page.DisplayIndex) -1;
switch(page.PageName)
{
case "indStart.ascx":
IndStart = (indStart) uc;
IndStart.Bind += new EventHandler(test_handler);
view.Controls.Add(IndStart);
MultiView1.Views.AddAt(viewNumber, view);
break;
case "indDemographics.ascx":
IndDemographics = (indDemographics)uc;
IndDemographics.Bind += new EventHandler(test_handler);
view.Controls.Add(IndDemographics);
MultiView1.Views.AddAt(viewNumber, view);
break;
case "indAssetSurvey.ascx":
IndAssetSurvey = (indAssetSurvey)uc;
IndAssetSurvey.Bind += new EventHandler(test_handler);
view.Controls.Add(IndAssetSurvey);
MultiView1.Views.AddAt(viewNumber, view);
break;
}
}
base.OnInit(e);
}
Заранее спасибо!





Вы можете попробовать TypeOf (в C#) или uc.GetType () сработает.
Как насчет:
Type t = uc.GetType();
EventInfo evtInfo = t.GetEvent("Bind");
evtInfo.AddEventHandler(this, new EventHandler(test_handler));
Я не тестировал этот код, но он должен быть примерно таким.
Я не вижу в вашем коде ничего, относящегося к конкретному классу управления. Вы выполняете точно такие же операции, и похоже, что все пользовательские элементы управления унаследованы от Control.
Если единственная конкретная вещь - это привязка события (т. Е. Класс Control не имеет события Bind), тогда лучше подумайте о рефакторинге вашего кода, поэтому вы сделаете все свои пользовательские элементы управления для наследования следующим образом: Control -> MyBaseControl (поместите событие здесь) -> YouControl.
Если вы не можете контролировать источник элементов управления, то предложение Джеруна должно сработать.
Как насчет определения интерфейса с помощью события Bind и реализации его в элементах управления?
public interface IBindable
{
event EventHandler Bind;
}
Затем:
foreach (IndividualPageSequence page in pages)
{
IBindable uc = Page.LoadControl(page.PageName) as IBindable;
if ( uc != null )
{
uc.Bind += new EventHandler(test_handler);
View view = new View();
view.Controls.Add(page);
int viewNumber = Convert.ToInt32(page.DisplayIndex) -1;
MultiView1.Views.AddAt(viewNumber, view);
}
}