私はWindowsフォームコントロールを扱うC#コードを扱っています。ここで小さな例では、いくつかのコントロールのために(スクリーン座標で)外接する四角形を取得するための小さなラッパーです:C#コードを.NET <4でレイトバインドするための最も侵略的でない方法は何ですか?
public class GUIObject {
protected Control m_control;
// [..]
public virtual Rectangle Bounds {
get {
Rectangle r = m_control.Bounds;
if (m_control.Parent != null) {
return m_control.Parent.RectangleToScreen(r);
}
return r;
}
}
}
このコードは、顧客にロードされるように、「プラグイン」として配布されたライブラリにコンパイルされますアプリケーション。しかし、一部の顧客は、プラグインがリンクされていたバージョンとは異なるバージョンのWindowsフォームをアプリケーションで使用していました。私の計画は、上記のコードを遅くすることでこれに取り組み、現在のアプリケーションドメインにロードされているどのWindowsフォームのバージョンでも動作するようにしました。 .NET 4では、キーワードdynamic
を使用できましたが、残念ながら、このコードは.NET3アプリケーションでも動作するはずです。
public class LateBoundObject {
private Object m_o;
// [..]
public Object GetProperty(String name) {
PropertyInfo pi = m_o.GetType().GetProperty(name);
return pi == null ? null
: pi.GetValue(m_o, null);
}
public Object InvokeMethod(String name, Object[] args) {
MethodInfo mi = m_o.GetType().GetMethod(name);
return mi == null ? null
: mi.Invoke(m_o, args);
}
}
public class GUIObject {
protected LateBoundObject m_control;
// [..]
public virtual Rectangle Bounds {
get {
Object r = m_control.GetProperty("Bounds");
if (r == null) {
return new Rectangle();
}
Object parent = m_control.GetProperty("Parent");
if (parent != null) {
LateBoundObject po = new LateBoundObject(parent);
r = po.InvokeMethod("RectangleToScreen",
new Object[] { r });
}
return (Rectangle)r;
}
}
}
ない非常にきれい:したがって、私は、リフレクションAPIを少しよりよいを使用して作る小さなヘルパーオブジェクトを導入し、リフレクションAPIを使用して開始しました。呼び出し側では多くのキャストが必要で、遅かれ早かれオーバーロードされたメソッドやプロパティにも対処しなければならないと思います。理想的には、ラッパーオブジェクトは元のコードを非常に同じに保つことができます。
LateBoundObject
ラッパークラスの修正を開始する前に、他の誰かがリフレクションAPIを使用してC#コードをレイトバインドする経験がありますか?もしそうなら、生のリフレクションAPIを最小限に抑えるという痛みを避けるためにどうやってアプローチしましたか?また、LateBoundObject
の行に沿ってラッパークラスを使用しましたか、まったく違うルートに行きましたか?私は、元のコードに関する限り、最も侵襲的な方法を探しています。
いくつの「WinFormsバージョン」がいくつありますか?私はあなたがFx2.0用のlibをターゲットにし、Fx1用とFx4用の別々のものを作るべきだと思う。 –
@HenkHolterman:Windows Formsの場合、プラグインを複数回構築するだけで十分だろう。しかし、私は他のツールキット(WPFや「拡張WPF」のような多くのサードパーティのツールキット)で同じ問題に直面しています。だから私は、私のコードを遅くすることで、何度も何度もビルドするのを避けることができるのだろうかと思います。 –
あなたのFx4ユーザーにレイトバインドされたFx1.1コードを適用してもよろしいですか? –