C # глубокое / вложенное / рекурсивное слияние динамических / расширяемых объектов

Мне нужно «объединить» 2 динамических объекта в C #. Все, что я нашел на stackexchange, касалось только нерекурсивного слияния. Но я смотрю на то, что делает рекурсивное или глубокое слияние, почти так же, какJQuery-х$.extend(obj1, obj2) функция.

При столкновении двух участников должны применяться следующие правила:

Если типы не совпадают, должно быть сгенерировано исключение и слияние отменено. Исключение: obj2 Значение может быть нулевым, в этом случае используется значение и тип obj1.Для тривиальных типов (типы значений + строка) значения obj1 всегда предпочтительнееДля нетривиальных типов применяются следующие правила:IEnumerable & IEnumberables<T> просто объединены (возможно.Concat() ? )IDictionary & IDictionary<TKey,TValue> объединены; Ключи obj1 имеют приоритет при столкновенииExpando & Expando[] типы должны быть объединены рекурсивно, тогда как Expando [] всегда будет иметь только элементы одного типаМожно предположить, что в коллекциях нет объектов Expando (IEnumerabe & IDictionary)Все другие типы могут быть отброшены и не должны присутствовать в результирующем динамическом объекте

Вот пример возможного слияния:

dynamic DefaultConfig = new {
    BlacklistedDomains = new string[] { "domain1.com" },
    ExternalConfigFile = "blacklist.txt",
    UseSockets = new[] {
        new { IP = "127.0.0.1", Port = "80"},
        new { IP = "127.0.0.2", Port = "8080" }
    }
};

dynamic UserSpecifiedConfig = new {
    BlacklistedDomain = new string[] { "example1.com" },
    ExternalConfigFile = "C:\\my_blacklist.txt"
};

var result = Merge (UserSpecifiedConfig, DefaultConfig);
// result should now be equal to:
var result_equal = new {
    BlacklistedDomains = new string[] { "domain1.com", "example1.com" },
    ExternalConfigFile = "C:\\my_blacklist.txt",
    UseSockets = new[] {
        new { IP = "127.0.0.1", Port = "80"},
        new { IP = "127.0.0.2", Port = "8080" }
    }
};

Есть идеи, как это сделать?

Ответы на вопрос(2)

Ваш ответ на вопрос