解決策1:共通のインターフェイスを作成します。
// IParentControlUpdater.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
interface IParentControlUpdater {
event EventHandler<EventArgs> UpdateParent;
}
}
// DynamicUserControl.ascx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DynamicUserControl : System.Web.UI.UserControl, IParentControlUpdater {
protected void Page_Load(object sender, EventArgs e) { }
#region IParentControlUpdater Members
public event EventHandler<EventArgs> UpdateParent;
#endregion
}
}
// Default.aspx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) { }
private void LoadMyUserControl(string controlName) {
UserControl control = (UserControl)LoadControl(controlName);
// Do some stuff
((IParentControlUpdater)control).UpdateParent += new EventHandler<EventArgs>(control_UpdateParent);
}
private void control_UpdateParent(object sender, EventArgs e) {
throw new NotImplementedException();
}
}
}
溶液#2:基本クラスを作成します。 ベースユーザコントロールクラス(例:DynamicUserControlBase)を作成します。
// DynamicUserControlBase.ascx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DynamicUserControlBase : System.Web.UI.UserControl {
protected void Page_Load(object sender, EventArgs e) { }
// Base event
public event System.EventHandler<System.EventArgs> UpdateParent;
}
}
その後、あなたのユーザーコントロールの中であなたが動的にupdateParentイベントを作成し、サブスクライブしたい:
// DynamicUserControl.ascx.cs
namespace AspNetUserControlDynamicEvent {
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class DynamicUserControl : DynamicUserControlBase {
protected void Page_Load(object sender, EventArgs e) { }
}
}
注それはDynamicUserControlBaseから継承方法。さて、あなたのLoadMyUserControl方法のために:あなたがコントロールのみの1種類で作業している場合
private void LoadMyUserControl(string controlName) {
DynamicUserControlBase control = (DynamicUserControlBase)LoadControl(controlName);
// Do some stuff
control.UpdateParent += new EventHandler<EventArgs>(HandledEvent);
}
private void HandledEvent(object sender, EventArgs e) {
throw new NotImplementedException();
}
しかし、あなたは同じように簡単にLoadControlにボクシングを変更することができます:
WebUserControl1 control = (WebUserControl1)LoadControl(controlName); // example
しかし、それはあるかのように思えますおそらく多くの異なるタイプのユーザーコントロールをロードすることを検討しているので、最初のソリューションは正常に動作するはずです。
リフレクション経由であなたの懸念については、これを試してみてください。
Type type = MyControl.GetType();
EventInfo eventInfo = type.GetEvent("UpdateParent");
EventHandler handler = new EventHandler(HandledEvent);
eventInfo.AddEventHandler(MyControl, handler);
は、私はあなたがユーザーコントロール対MyUserControl1にユーザーコントロールをキャストしたいと思います。 –
なぜイベントリフレクションを持つ共通インターフェースIControlを作成し、インターフェースタイプにキャストし、そのように参照できるのでしょうか?このように、複数のUCが署名を満たしていますが、強くタイプされたものを参照することができます... –
私はこれを感謝しますが、私は本当に限られた反射スキルを磨くことを試みています。反射によってこれを行うことはできませんか? – Uproden