结合两种匿名类型

时间:2011-09-12 09:40:11

标签: .net asp.net-mvc-3 c#-4.0 anonymous-types

我之前询问了相关问题,并对How could i define anonymous type?

进行了gretat ansfer

但现在我想知道是否可以结合两种匿名类型

基本上我将一些每周数据存储在缓存中,就像我在相关的queston

中描述的那样

因此,如果我将anonymous type存储为object,则它包含当前周的一些数据 我想每天将今天的数据附加到该对象上。

所以我在anonymous type中的数据作为object来自一方,而另一方我有完全相同的结构anonymous type,我想要追加/添加来自我的新{{1}的数据将旧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更新缓存,其中包含两个匿名实例的组合结果。

1 个答案:

答案 0 :(得分:1)

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

在你的情况下不确定它是否可以接受,但仍然有效。