4 に答える
すべてのコントロール メソッドを含むインターフェイスを作成する
public interface IMyControl
{
public void clear();
public string getastringvalue();
etc......
}
このインターフェイスから継承するすべてのコントロールを取得します。
public class MyControl : UserControl, IMyControl
すべてのコントロールをインターフェイスにキャストします。
private void button1_Click(object sender, EventArgs e)
{
IMyControl typedControl = hActiveUsrCtrl as IMyControl;
typedControl.Clear();
etc...
}
反対側では、リフレクションは非効率的であり、可能な限り避けるべきです!
UserControls はクラスとして実装されるため、そのクラスにインターフェイスを実装させ、その方法で GetData メソッドを呼び出すだけです。
public interface IGetData {
string GetData(parameters ...);
}
public class MyUserControl : UserControl, IGetData {
...
}
すべてのユーザー コントロールが GetData メソッドに対して同じシグネチャを持つことができる場合、それがどのタイプであるかを把握する必要さえなく、IGetData にキャストするだけです。
IGetData getable = activeCtrl as IGetData;
if (getable != null) {
var data = getable.GetData(...);
// do stuff with data
} else {
throw new ApplicationException("activeCtrl was null or didn't implement IGetData");
}
アップデート:
私が理解していれば、中間変数が必要なようです。
// newUc implements IGetData, not hActiveUsrCtrl
IGetData newUc = hActiveUsrCtrl.GetActiveUsrCtrl(parent.appInfo.catalogId, parent);
pUserControlContainer.Controls.Add((Control)newUc);
var data = newUc.GetData(parameters ...);
すべてのコントロールが同じパブリック メソッドなどを持っている場合、インターフェイスを使用しないのはなぜですか。
コントロール ファクトロイ クラス ControlFactory.GetUserSelectionControl() を実装できます。このメソッドは、ユーザーの選択に一致する最適なコントロールを実行時に作成します。最適なコントロールを特定するために、ある種の入力を渡すことができます。また、すべてのコントロールが同じインターフェイスを実装しています。次に、リフレクションなしでメソッドを直接呼び出すことができます。しかし、それまでの間、インターフェースの実装方法の例は既に得られています。