2
4

4 に答える 4

1

すべてのコントロール メソッドを含むインターフェイスを作成する

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...
}

反対側では、リフレクションは非効率的であり、可能な限り避けるべきです!

于 2013-03-18T13:36:07.570 に答える
0

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(pare‌​nt.appInfo.catalogId, parent);
pUserControlContainer.Controls.Add((Control)newUc);

var data = newUc.GetData(parameters ...);
于 2013-03-18T13:32:58.020 に答える
0

すべてのコントロールが同じパブリック メソッドなどを持っている場合、インターフェイスを使用しないのはなぜですか。

コントロール ファクトロイ クラス ControlFactory.GetUserSelectionControl() を実装できます。このメソッドは、ユーザーの選択に一致する最適なコントロールを実行時に作成します。最適なコントロールを特定するために、ある種の入力を渡すことができます。また、すべてのコントロールが同じインターフェイスを実装しています。次に、リフレクションなしでメソッドを直接呼び出すことができます。しかし、それまでの間、インターフェースの実装方法の例は既に得られています。

于 2013-03-18T13:33:38.520 に答える