C# 我可以在C语言中将泛型类型强制转换为Dictionary吗?

C# 我可以在C语言中将泛型类型强制转换为Dictionary吗?,c#,C#,我在一些字典集合中有程序设置。 我需要通过配置文件dst dictionary中的设置来更新默认设置src dictionary。 因此,我编写了一个通用扩展方法,它不适用于字典内部的字典: public static class DictionaryExtensions { public static void Update<T, U>(this Dictionary<T, U> src, Dictionary<T, U> dst) {

我在一些字典集合中有程序设置。 我需要通过配置文件dst dictionary中的设置来更新默认设置src dictionary。 因此,我编写了一个通用扩展方法,它不适用于字典内部的字典:

public static class DictionaryExtensions
{
    public static void Update<T, U>(this Dictionary<T, U> src, Dictionary<T, U> dst)
    {
        // Update values by keys
        var keys = src.Select(x => x.Key).ToArray();
        foreach (var key in keys)
            if (dst.ContainsKey(key))
            {
                if (typeof(U).GetGenericTypeDefinition() == typeof(Dictionary<,>))
                {                                                    // Error in recursively calling:
                    var d1 = src[key] as Dictionary<object, object>; // d1 is null, but it is Dictionary<,>
                    var d2 = dst[key] as Dictionary<object, object>; // d2 is null, but it is Dictionary<,>
                    d1.Update(d2);                                   // How can I call it?
                }
                else
                    src[key] = dst[key];
            }

        // Append not exist values
        keys = dst.Select(x => x.Key).ToArray();
        foreach (var key in keys)
            if (!src.ContainsKey(key))
                src.Add(key, dst[key]);
    }
}

我可以将类U强制转换为未知类型的字典,然后递归调用Update方法吗?

使用IDictionay,而不是使用泛型类型,如果可以的话, 我没有试过

public static class DictionaryExtensions
{
    public static void Update(this IDictionary src, IDictionary dst)
    {
        foreach (object srcKey in src.Keys)
        {
            foreach (object dstKey in dst.Keys)
            {
                if (dst.Contains(srcKey))
                {
                    IDictionary d1 = src[srcKey] as IDictionary;
                    IDictionary d2 = dst[srcKey] as IDictionary;
                    if (d1 != null && d2 != null)
                    {
                        d1.Update(d2);
                    }
                    else
                        src[srcKey] = dst[srcKey];
                }
            }
        }

        foreach (object dstKey in dst.Keys)
            if (!src.Contains(dstKey))
                src.Add(dstKey, dst[dstKey]);
    }
}
像这样使用

Dictionary<object, object> a = new Dictionary<object, object>();
Dictionary<object, object> b = new Dictionary<object, object>();
a.Update(b);

感谢TimChang,现在我的代码是:

public static class DictionaryExtensions
{
    public static void Update(this IDictionary src, IDictionary dst)
    {
        foreach (var key in dst.Keys)
            if (src.Contains(key))
            {
                if (src[key] is IDictionary a &&
                    dst[key] is IDictionary b)
                    a.Update(b);
                else
                    src[key] = dst[key];
            }
            else
            {
                src.Add(key, dst[key]);
            }
    }
}

通常,作业从dst转到src,而不是相反。你能在这里解释一下你的目标吗?为什么这里需要未知类型字典?因为有四个字典具有不同的枚举键和值。而且设置可能会变得更加复杂。现在每个字典有四种实现,但我试图改进我的代码。@JoelCoehoorn从目标到源?那对我来说毫无意义。源头是你的起点,终点是你的终点。乔尔·科霍恩,你的话并不能解决问题