7

ここに私が書こうとしているものがあります:

public void Foo<T>(T parameter) {
  otherObject.Bar<T>(parameter);
}

Bar() メソッドのシグネチャは次のとおりです。

public void Bar<T>(T parameter) where T: class 

Foo の署名の T には同じ制約がないため、コンパイル エラーが発生します。残念ながら、私は書くことができません:

public void Foo<T>(T parameter) where T: class {
  otherObject.Bar<T>(parameter);
}

Foo は外部インターフェイスで定義されたメソッドを実装しているためです。質問は:

Bar を呼び出す前に、メソッド Foo 内でどうにか T を転置できますか。(注、T は常にクラスになると確信できます。コンパイラを通過する必要があるだけです)。

私が見つけた唯一の方法はリフレクションを使用することですが、見逃している簡単なトリックがあるのではないかと思います。

4

4 に答える 4

9

次のようなdynamicキーワードを使用できます。

public void Foo<T>(T parameter)
{
    dynamic p = parameter

    otherObject.Bar(p);
}

何が起こっているかというとotherObject.Bar、パラメータの 1 つがdynamic. それが参照型であると仮定するとT、解決は成功します。

確かに、これは最終的にリフレクションを使用しますが (ご指摘のとおり)、構文はおそらく使用しているよりも優れています。

もちろん、これにより、クラスでTないイベントで実行時エラーが発生します。

于 2012-07-11T16:10:04.703 に答える
4
public void Foo<T>(T parameter)
{
    otherObject.Bar<object>(parameter);
}
于 2012-07-11T16:11:49.123 に答える
3

これは、暗黙的なインターフェイスの実装を使用して、casperOneの答えを少し変えたものです。

public void Foo<T>(T parameter) where T: class {
    otherObject.Bar<T>(parameter);
}

void IFoo.Foo<T>(T parameter){
    Foo((dynamic)parameter);
}

.Fooこれにより、コンパイル時に呼び出している特定のオブジェクトの種類を知っているものに制約を含めることができますが、IFooインターフェイスを実装することもできます。

于 2012-07-11T16:16:17.757 に答える
0

あなたが otherObject.Bar の所有者である場合、クラス制約を削除することはできませんか? その方法の。または、制約なしで新しい同様のメソッドを作成しますか?

キャスパーワン。Foo メソッドにクラス制約があるため、答えが正しいかどうかはわかりません。Foo は外部インターフェイスの実装であるため、これは不可能であるとの質問がありました。たとえば、次のコードは機能しません。

public void Foo<T>(T param)
    {
        dynamic xx = param;

        this.Bar(param);
    }

    private void Bar<T>(T param) where T: class {

    }

そして、エラーとして表示されます。

于 2012-07-11T16:12:48.357 に答える