私は、Interopを使用してC#.NETアプリケーションで使用しているCOMインターフェイスをエクスポートするサードパーティのクローズドソースアプリケーションを持っています。このCOMインターフェイスは、適切なインターフェイスタイプにキャストするまで、すべてがSystem.Objectとして表示される多くのオブジェクトをエクスポートします。これらのオブジェクトのすべてのプロパティを割り当てたいと思います。したがって:「プロパティXを持つ」という一般的な関数ですか?
foreach (object x in BigComInterface.Chickens)
{
(x as Chicken).attribute = value;
}
foreach (object x in BigComInterface.Ducks)
{
(x as Duck).attribute = value;
}
しかし、プロパティを割り当てるには、私が回復するので、私は本当に一つ一つの周りのtry/catchを望んでいるから、例外をスローする(不可避であるアプリケーション固有の理由で)可能性があります。したがって:
foreach (object x in BigComInterface.Chickens)
{
SetAttribute<Chicken>(x as Chicken, value);
}
foreach (object x in BigComInterface.Ducks)
{
SetAttribute<Duck>(x as Duck, value);
}
void SetAttribute<T>(T x, System.Object value)
{
try
{
x.attribute = value;
}
catch
{
// handle...
}
}
が問題を参照してください:明らか
foreach (object x in BigComInterface.Chickens)
{
try
{
(x as Chicken).attribute = value;
}
catch (Exception ex)
{
// handle...
}
}
foreach (object x in BigComInterface.Ducks)
{
try
{
(x as Duck).attribute = value;
}
catch (Exception ex)
{
// handle...
}
}
は、それがこれを行うにはそんなにきれいでしょうか?私のxの値はどのタイプでも構わないので、コンパイラは.attributeを解決できません。チキンとアヒルはどんな種類の継承ツリーにもなく、.attributeのインターフェイスを共有していません。もしそうなら、そのインターフェイスの制約をTに置くことができます。しかし、クラスは閉鎖ソースなので、それは私には不可能です。
私が欲しいのは、特定のインターフェイスを実装しているかどうかにかかわらず、に.attributeプロパティがあるという制約が必要なようなものです。ウィットに、
void SetAttribute<T>(T x, System.Object value) where T:hasproperty(attribute)
は、私はそうでアヒル、牛、羊、および、ペースト/鶏のそれぞれについて、この小さなtry/catchブロックをカットする以外、ここから何をすべきかわかりません。
私の質問は:オブジェクトの特定のプロパティを呼び出すには、そのプロパティを実装するインターフェイスをコンパイル時に知ることができない場合に、この問題を回避するにはどうすればよいですか?
ありがとう、Reed。私はReflectionテクニックを試しました - それは私が必要とすることについては行いますが、それは遅いです。 – catfood
共通のインターフェースがないので、高速vtableベースの汎用呼び出しを行う方法はありません。名前の動的検索が必要です。これは常に遅く、Reflectionかどうかです。 –
@Pavel:はい、それは常に遅いですが、技術的には、C#4が出るまで、既存のクラスを変更せずに動作する唯一の方法です。私はその良いことを言っているのではなく、むしろそれがうまくいくと言います。 –