diff --git a/OpenRA.Game/Network/SyncReport.cs b/OpenRA.Game/Network/SyncReport.cs index a967573b0b..e500576903 100644 --- a/OpenRA.Game/Network/SyncReport.cs +++ b/OpenRA.Game/Network/SyncReport.cs @@ -29,6 +29,21 @@ namespace OpenRA.Network readonly Report[] syncReports = new Report[NumSyncReports]; int curIndex = 0; + static NamesValuesPair DumpSyncTrait(ISync sync) + { + var type = sync.GetType(); + TypeInfo typeInfo; + lock (typeInfoCache) + typeInfo = typeInfoCache[type]; + var values = new string[typeInfo.Names.Length]; + var index = 0; + + foreach (var func in typeInfo.MemberToStringFunctions) + values[index++] = func(sync); + + return Pair.New(typeInfo.Names, values); + } + public SyncReport(OrderManager orderManager) { this.orderManager = orderManager; @@ -80,21 +95,6 @@ namespace OpenRA.Network } } - static NamesValuesPair DumpSyncTrait(ISync sync) - { - var type = sync.GetType(); - TypeInfo typeInfo; - lock (typeInfoCache) - typeInfo = typeInfoCache[type]; - var values = new string[typeInfo.Names.Length]; - var index = 0; - - foreach (var func in typeInfo.MemberToStringFunctions) - values[index++] = func(sync); - - return Pair.New(typeInfo.Names, values); - } - internal void DumpSyncReport(int frame) { foreach (var r in syncReports) @@ -182,11 +182,10 @@ namespace OpenRA.Network "Invalid Property: " + prop.DeclaringType.FullName + "." + prop.Name); var sync = Expression.Convert(syncParam, type); - MemberToStringFunctions = fields.Select( - fi => MemberToString(Expression.Field(sync, fi), fi.FieldType, fi.Name)) - .Concat(properties.Select( - pi => MemberToString(Expression.Property(sync, pi), pi.PropertyType, pi.Name)) - ).ToArray(); + MemberToStringFunctions = fields + .Select(fi => MemberToString(Expression.Field(sync, fi), fi.FieldType, fi.Name)) + .Concat(properties.Select(pi => MemberToString(Expression.Property(sync, pi), pi.PropertyType, pi.Name))) + .ToArray(); Names = fields.Select(fi => fi.Name).Concat(properties.Select(pi => pi.Name)).ToArray(); } @@ -198,7 +197,6 @@ namespace OpenRA.Network var toString = memberType.GetMethod("ToString", Type.EmptyTypes); Expression getString; if (memberType.IsValueType) - // (ISync sync) => ((TSync)sync).Foo.ToString() getString = Expression.Call(getMember, toString); else { @@ -210,6 +208,7 @@ namespace OpenRA.Network var nullMember = Expression.Constant(null, memberType); getString = Expression.Condition(Expression.Equal(member, nullMember), nullString, getString); } + return Expression.Lambda>(getString, name, new[] { syncParam }).Compile(); } }