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>;

因为第二个参数可以是另一种类型。

先感谢您。

4

1 回答 1

0

认为您可能以稍微错误的方式看待泛型,但没关系,让我们谈谈!

IDictionary<TKey, TValue>是完美的,并且您正确使用了它,但是我认为在回退时,除非您明确知道您期望的类型是什么,否则强制转换它没有真正意义。

或者,出于强类型可爱的目的,我会推荐什么;您提到可能是第二种类型,也就是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 回答