如何使用词典引用动态类型?

时间:2015-12-29 21:31:46

标签: c# .net generics dictionary dynamic

首先,我的代码如下:

public static class ApplicationCacheDictionary
{
    private static Dictionary<string, Type> CacheDictionary = new Dictionary<string, Type>
    {
        {"X1", typeof (class1)},
        {"X2", typeof (class2)},
    };

    public static Type GetMatchingType(string y, string x)
    {
        var key = x + y;
        if (!CacheDictionary.ContainsKey(key))
            return null;
        else
            return CacheDictionary[key];
        return null;
    }
}

然后在另一个班级,我有以下代码:

dynamic appCache = ApplicationCacheDictionary.GetMatchingType("X", "1");
dynamic result = ApplicationCache.Get<List<appCache>>("X1");

以下是Get:

的定义
public static T Get<T>(string key) where T : class
{
    try
    {
        return (T) Cache.Value[key];
    }
    catch (Exception exception)
    {
        return null;
    }
}

我遇到的问题是行

dynamic result = ApplicationCache.Get<List<appCache>>("X1");

我收到以下错误消息:“是一个变量,但像类型一样使用”。我最初尝试使用以下代码解决此问题:

dynamic result = ApplicationCache.Get<List<dynamic>>("X1");

这已编译但我收到一个空值,其中应该有一个(实际类中的硬编码代替动态作品,但我试图摆脱它。)任何建议我还可以尝试什么得到这个吗?

1 个答案:

答案 0 :(得分:6)

dynamic result = ApplicationCache.Get<List<appCache>>("X1");

在这一行中,您告诉ApplicationCache的Get方法使用类型List<appCache>作为T.这不会起作用,因为您正试图通过在变量而不是类型作为泛型类型。这看起来也不像你想用这段代码完成的。

相反,调用这样的函数:

dynamic result = ApplicationCache.Get<dynamic>("X1");

这会将字典中的类型转换为动态并将其返回到动态变量。

尽管如此,这似乎并不能很好地利用泛型。您正在处理的缓存将始终返回Typenull。我不确定你的意图是什么。您是否只是想获得缓存类型?你想要一个该类型的实例化吗?