13

Dictionary<string, Anything>a を一貫した中間ジェネリック型にキャストすることは可能ですか? それで、、、、すべてを同じタイプ<string, string>の辞書にキャストできますか?<string, bool><string, int><string, anything>

私は大量のリフレクションを使用しているプロジェクトに取り組んでおり、DIctionary 型をそのまま処理できるようにする必要があります。

FieldInfo field = this.GetType().GetField(fieldName);
Dictionary<string, Object> dict = (Dictionary<string, Object>)field.GetValue(this);

上記のコードは私が現在持っているものであり、プログラムは field.GetValue から generic へのキャストで常に失敗しますDictionary<string, Object>

これを行う方法はありますか?または、これらの辞書を処理する別の方法を考え出す必要がありますか?

どんな助けでも大歓迎です。

4

8 に答える 8

16

AakashM の回答に続いて、キャストはボールをプレーしていないようです。ただし、小さなヘルパー メソッドを使用して回避できます。

IDictionary dictionary = (IDictionary)field.GetValue(this);
Dictionary<string, object> newDictionary = CastDict(dictionary)
                                           .ToDictionary(entry => (string)entry.Key,
                                                         entry => entry.Value);

private IEnumerable<DictionaryEntry> CastDict(IDictionary dictionary)
{
    foreach (DictionaryEntry entry in dictionary)
    {
        yield return entry;
    }
}

この例では、foreach でのアヒルの入力が便利です。

于 2012-04-18T10:20:46.030 に答える
14

Is this helping you ?

Dictionary<a, b> output =
   input.ToDictionary(item => item.Key, item => (SomeType)item.Value);
于 2012-04-18T09:30:58.483 に答える
10

これを表現する方法を見つけることができたとしても、それは間違ったことです。 aDictionary<string, bool> aであるというのは正しくないため、 をキャストDictionary<string, object>したくはありません。キャストできれば、値として aを入れることができると考えてください。これは明らかに適合しません!string

ただし、できることは、非ジェネリックIDictionary(すべてDictionary<,>の s が実装する) にキャストし、それを使用して同じ値で新しいを構築することです。 Dictionary<string, object>

FieldInfo field = this.GetType().GetField(fieldName);
IDictionary dictionary = (IDictionary)field.GetValue(this);
Dictionary<string, object> newDictionary = 
    dictionary
    .Cast<dynamic>()
    .ToDictionary(entry => (string)entry.Key,
                  entry => entry.Value);

(ここで説明した理由により、.Cast<DictionaryEntry>ここでは使用できないことに注意してください。C#4より前で、持っていない場合は、 Gibsnagの回答が行うように、手動で列挙を行う必要があります)dynamic

于 2012-04-18T09:51:37.990 に答える
0

objectto および from のキャストが本当に必要かどうかを検討してください。私はその道をたどり始め、変換ではなくジェネリックによって必要なものを達成できることに気付く前に、この記事に出くわしました. 例えば;

class DictionaryUtils<T>
{
    public static T ValueOrDefault(IDictionary<string, T> dictionary, string key)
    {
        return dictionary.ContainsKey(key) ? dictionary[key] : default(T);
    }
}

このコードははるかにクリーンで、他の回答に示されている同等の変換コードよりも高速です。

于 2016-05-26T14:58:06.107 に答える