Объедините два анонимных типа - PullRequest
1 голос
/ 12 сентября 2011

Я задал соответствующий вопрос раньше и получил gretat ansfer по этому вопросу Как я могу определить анонимный тип?

Но теперь мне интересно, можно ли объединить два анонимных типа

В основном я храню некоторые еженедельные данные в кеше, как я описал в соответствующем квесте

Так что, если у меня anonymous type хранится как object, он содержит некоторые данные за текущую неделю и я хочу добавлять сегодняшние данные к этому объекту каждый день.

Итак, у меня есть данные в anonymous type как object с одной стороны, а с другой у меня полностью такая же структурированная anonymous type, и я хочу добавить / добавить данные из моего нового anonymous type к старому, который anonymous type как object и вернуть его в кеш.

Если вы посмотрите мой связанный вопрос, мой анонимный тип выглядит так:

var jsonData = new { total = 0, page = 0, records = 0,
                     rows = new[] { new { dummy = "" } };

Итак, вопрос в том, как я могу объединить анонимные типы в моем случае?

Например, если бы это были две коллекции, я бы пошел вот так

List<Data> weeklyFromCahce = GetFromCache()
List<Data> todaysToCahce = GetFromDataBase();

и затем я зациклился бы todaysToCahce и добавил бы каждый элемент в weeklyFromCahce, и это поместило обновленный weeklyFromCahce обратно в кеш.

Так что я хочу сделать аналогичный процесс, но с анонимными типами в моем случае. Объединенный результат должен быть anonymous type, который будет содержать еженедельные данные + данные текущего дня, и я обновлю кеш новым anonymous type, который будет содержать объединенный результат двух анонимных экземпляров.

1 Ответ

1 голос
/ 12 сентября 2011
var x = new { member1 = 123 };
var y = new { member2 = "qwerty" };
var z = new { part1 = x, part2 = y }; // combined

Обновлено после комментария TS

var x = new { member1 = 123 };
var y = new { member2 = "qwerty" };
var z = new { member1 = x.member1, member2 = y.member2 }; // combined

Обновление 2

class DynamicPair<TX, TY> : DynamicObject
{
    private readonly TX _x;
    private readonly TY _y;

    public DynamicPair(TX x, TY y)
    {
        _x = x;
        _y = y;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        try
        {
            var property = typeof (TX).GetProperty(binder.Name);
            if (property != null)
            {
                result = property.GetValue(_x, null);
                return true;
            }

            property = typeof (TY).GetProperty(binder.Name);
            if (property != null)
            {
                result = property.GetValue(_y, null);
                return true;
            }
        }
        catch
        {
        }

        result = null;
        return false;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        // too lazy
        return true;
    }
}


class Program
{
    private static DynamicPair<TX, TY> Combine<TX, TY>(TX x, TY y)
    {
        return new DynamicPair<TX, TY>(x, y);
    }

    static void Main(string[] args)
    {
        var x = new { a = 123 };
        var y = new { b = 222 };
        dynamic z = Combine(x, y);
        Console.WriteLine("{0}, {1}", z.a, z.b);
    }
}

Не совсем уверен, приемлемо ли это в вашем случае, но все же оно работает.

...