0

Property<T>isのインスタンスを取得し、そのジェネリック型パラメーターをProperty知らなくても、そのメソッドを呼び出すことは可能でしょうか?T

private interface Property<T> 
{
    T Value { get;}
    void DestroyEarth();
}

class MyProperty : Property<int>
{
    public int Value{ get { return 1 }; }
    public void  DestroyEarth() { }
}

DestroyEarth()したがって、次のようなメソッドで受信した MyProperty インスタンスを呼び出すことができるかどうか疑問に思っています

void PropertyCaller(Property p){p.DestroyEarth();}

(注:Propertyどこにも単純なクラスやインターフェースを定義したり、持ったりしていません)

4

3 に答える 3

2

編集:

質問の編集では、次のように言います:非ジェネリックインターフェイスを宣言し、に関連しないメソッドを移動しますT。たとえば:

interface IProperty {
    object Value { get;}
    void DestroyEarth();
}
interface IProperty<T> : IProperty {
    new T Value { get;}
}

class MyProperty : IProperty<int>
{
    object IProperty.Value { get { return Value; } }
    public int Value{get {return 1;} }
    public void  DestroyEarth(){}
}

. _ IProperty_T

(コードを投稿する前とは別の回答が履歴にあります)

次に、次のようになります。

void PropertyCaller(IProperty p) { p.DestroyEarth(); }

もちろん、コンパイラに次のことを理解させることもできますT

void PropertyCaller<T>(IProperty<T> p) { p.DestroyEarth(); }
于 2012-08-13T09:47:21.200 に答える
0

あなたが求めているのは、 T がわからず、何らかの方法でそのインスタンスを呼び出したい場合に、Property<T>型から(推測する) への自動変換です。Property<object>これはさまざまな理由で実行できません (問題空間に関する洞察を得るために、ジェネリック型の「共分散/反分散」を調べてください)。

この変換を自分で行うことをお勧めしIPropertyます。クラスの上に (非ジェネリック - Marc の回答を参照) インターフェイスを実装します。このインターフェイスProperty<T>は、同じ署名を持つがオブジェクトとして記述された T を使用します。次に、必要に応じて、キャストを使用して T メソッドへの呼び出しのリダイレクトを手動で実装します。

于 2012-08-13T10:56:23.027 に答える
-1

あなたのPropertyクラスは、 に関係なくT、 からProperty<T>派生しProperty、 に関連するより多くの実装を持つ必要がありTます。

于 2012-08-13T09:44:19.013 に答える