我之前询问了相关问题,并对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
更新缓存,其中包含两个匿名实例的组合结果。
答案 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);
}
}
在你的情况下不确定它是否可以接受,但仍然有效。