2

次のように定義されたクラスがあります。

class ProxyWithSetter<T> : ProxyValue where T : Value

タイプのフィールドがあります

Action<T> Setter;

ProxyValueインスタンスのリストがあり、そのうちのいくつかは であるとします。 のサブクラスである型を持つオブジェクトを、 であると判断した s の 1 つProxyWithSetterに渡すにはどうすればよいでしょうか。ValueProxyValueProxyWithSetter

ここでの問題は、これらProxyValueの s の1 つを にキャストする必要があることですProxyWithSetterが、キャストには型パラメーターも必要です。関数に渡すオブジェクトの正確な型がコンパイル時にわからないため、提供できません。私はそれが のサブタイプであることだけを知っていValueます。

基本的にはこれがやりたかった

(p as ProxyWithSetter<Value>).Setter(val);

pは type ではないため、キャストは null を返しますProxyWithSetter<Value>が、正確な型を知る方法はありません。の正確なタイプもわかりませんval。それが実際に であることを知っておいてValueください。

なぜうまくいかないのか理解できます。実行可能な回避策を探しているだけです。

4

3 に答える 3

0

あなたはあなたが求めていることをすることはできません。(フィールドではなくプロパティである必要があります)を含む反変インターフェイスを作成した場合でも、タイプ以上の派生Setterアイテムのみを取得できます。T

たとえば、SuperValueサブクラス化するクラスがありValue、次にのインスタンスがある場合、ProxyWithSetter<SuperValue>そのインスタンスを渡すことはできませんValue。それは、SuperValueまたは何かサブクラス化する必要がありSuperValueます。

したがって、問題は、すべての人がそのProxyWithSetter<T>タイプの入力を受け入れることができるわけではないということです。ValueSetter

于 2013-03-19T02:04:16.367 に答える
0

次のインターフェイスを作成できます。

interface IProxyWithSetter
{
    Action<Value> Setter { get; }
}

そして、次のように実装します。

class ProxyWithSetter<T> : ProxyValue, IProxyWithSetter where T : Value
{
    Action<Value> IProxyWithSetter.Setter { get { return x => this.Setter((T)x); } }

    //other things
}

そうすれば、型が静的に知られているコンテキストでは、 を受け取りますSetterT、話しているメソッドでは、 を実行してas IProxyWithSetterから を呼び出すことができますSetter(val)

于 2013-03-19T18:48:30.570 に答える
0

を使用してタイプに関する情報を取得できます

p.GetType()

これを使用すると、文字列表現が次のような Type オブジェクトを取得できます。

ProxyWithSetter[Value]

でジェネリック型にアクセスできます

p.GetType().GenericTypeArguments

クラスのジェネリック パラメータであるすべての Type オブジェクトで構成される配列。あとはチェックするだけ

p.getType().GenericTypeArguments == typeof(Value)
于 2013-03-18T21:01:34.980 に答える