0

一般的な辞書は次のとおりです。

public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>

また、特定の辞書は次のようになります。

var container = new ConcurrentDictionary<string, Unit>();
var container = new ConcurrentDictionary<string, CustomUnitClass>();

これらの特別な辞書(異なるパラメーターを使用)は、アプリケーション状態で追加されました。

HttpContext.Current.Application[key] = container;

アプリケーションの状態からアイテムを取得すると(ここの何人かの人々がそれについて私を助けてくれました;彼らに感謝します)、私はこのようにタイプがConcurrentDictionaryであるかどうかをチェックすることができます:

object d = HttpContext.Current.Application[i];
if (d.GetType().GetGenericTypeDefinition() == typeof(ConcurrentDictionary<,>))

そして最後のポイントが残されました-オブジェクトdをジェネリックConcurrentDictionaryにキャストする方法:

ConcurrentDictionary<?, ?> unit = d as ConcurrentDictionary<?, ?>;

次のように特定のキャストを使用したくありません。

ConcurrentDictionary<string, Unit> unit = d as ConcurrentDictionary<string, Unit>;

2番目のパラメーターは別のタイプにすることができるためです。

前もって感謝します。

4

1 に答える 1

0

ジェネリックについて少し間違った見方をしているかもしれませんが、大丈夫です

あなたIDictionary<TKey, TValue>は完璧で、正しく使用していますが、キャストバックに関しては、期待しているタイプが何であるかを明示的に知らない限り、キャストしても意味がないと思います

または、強く型付けされた愛らしさのために、私がお勧めするもの。あなたは潜在的に2番目のタイプ、別名TValueが変化する可能性があると述べました...これはインターフェイスを使用するのに最適な時期です! 実演させてください。

私たちのインターフェース

public interface IModeOfTransport
{
    string Name { get; set; }
    string Colour { get; set; }
    bool CanFloat { get; set; }
    bool CanFly { get; set; }
    int NumberOfPassengers { get; set; }
}

私たちの目的

public class Car : IModeOfTransport
{
    // ...
}
public class Plane : IModeOfTransport
{
    // ...
}
public class Boat : IModeOfTransport
{
    // ...
}

私たちの実装

var modesOfTransport = new Dictionary<string, IModeOfTransport>();
modesOfTransport.Add("First", new Car());
modesOfTransport.Add("First", new Plane());
modesOfTransport.Add("First", new Boat());

休憩しよう

上記からわかるように、キーの型がstringで値の型がの辞書がありますIModeOfTransport。これにより、IModeOfTransportインターフェイスのすべてのプロパティとメソッドへの明示的な厳密に型指定されたアクセスが可能になります。これは、ディクショナリ内のジェネリック値に関する特定の情報にアクセスする必要があり、実際のオブジェクト型キャストが何であるかがわからない場合に推奨されます。インターフェイスを使用することで、類似点を見つけることができます。

ほぼ完了しました

object dictionary = HttpContext.Current.Application[i];
if (dictionary.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>))
{
    var modesOfTransport = dictionary as Dictionary<string, IModeOfTransport>;
    foreach (var keyValuePair in modesOfTransport)
    {
        // ...
    }
}
于 2012-05-31T08:44:26.533 に答える