【问题标题】:Combine two anonymous types结合两种匿名类型
【发布时间】:2011-09-12 09:40:10
【问题描述】:

我之前问过相关问题,并得到了How could i define anonymous type?的gretat ansfer

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

基本上我在缓存中存储一​​些每周数据,就像我在相关问题中描述的那样

所以如果我将anonymous type 存储为object 它包含一些本周的数据 我想每天将今天的数据附加到该对象。

所以我在anonymous type 中有数据作为object 从一侧和从另一侧我有完全相同的结构anonymous type 我想将我的新anonymous type 中的数据附加/添加到旧的anonymous typeobject 并将其放回缓存。

如果你看我的相关问题,我的匿名类型看起来像这样:

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 更新缓存,其中包含两个匿名实例的组合结果。

【问题讨论】:

  • “合并”到底如何?给我们两个例子和一个组合结果应该是什么的例子。
  • 你为什么要坚持匿名类型?如果在多个地方使用相同的数据格式,可以引入一个对象。
  • @henginy 可能是要走的路

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


【解决方案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);
    }
}

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

【讨论】:

  • 没有真正结合 :) 结果是 anonymous type,其中包含两个单独的 anonymous objects,而不是我想要的 one
猜你喜欢
  • 2011-10-08
  • 2010-10-14
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多