3

ここDictionary<string,K>で、K はリフレクションによって読み込まれる型です。K に名前を付けることはできません。

残念ながら、このメソッドをどのように使用すればよいかわかりませんTryGetValue。私はいくつかの異なることを試しましたが、それらはすべて例外につながります。私は何をすればいいですか?

dynamic dict = GetDictThroughMagic();
dynamic d;
bool hasValue = dict.TryGetValue("name",out d);
bool hasValue = dict.TryGetValue("name",d);

私はより詳細に書くことができますif(dict.Contains("name")) d=dict["name"]

しかし、より簡潔な TryGetValue アプローチを記述できればと思います。

実際の例外を含めるように更新:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: The
best overloaded method match for 'System.Collections.Generic.Dictionary<string,K>
.TryGetValue(string, out K)' has some invalid arguments
   at CallSite.Target(Closure , CallSite , Object , String , Object& )
4

3 に答える 3

3

ref.Net では、変数として使用される変数とoutパラメーターは型と正確に一致する必要があるため、これを行うことはできません。そして、dynamic変数は実際にはobject実行時の変数です。

ただし、どちらのパラメーターが戻り値であるかを切り替えることで回避できますが、それを使用outするのは通常よりも良くありませんTryGetValue()

static class DictionaryHelper
{
    public static TValue TryGetValue<TKey, TValue>(
        Dictionary<TKey, TValue> dict, TKey value, out bool found)
    {
        TValue result;
        found = dict.TryGetValue(value, out result);
        return result;
    }
}

次に、次のように呼び出すことができます。

dynamic dict = GetDictThroughMagic();
bool hasValue;
dynamic d = DictionaryHelper.TryGetValue(dict, "name", out hasValue);
于 2012-04-05T01:14:28.920 に答える
1

なぜあなたはを使用していdynamicますか?これは相互運用を介して行われますか? ここで使用できる一般的な抽象化を使用することをお勧めします。リフレクションは動的を意味するものではありません。このキーワードは、必要のない場所で静的言語に投げ込まれています。相互運用性のために設計されました...

あなたの質問に具体的に: Here is what like a good answer . タイプ K までキャストできないため、キャストがここで機能するとは考えていません。

于 2012-04-05T00:57:22.930 に答える