diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-03-08 18:39:11 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-03-08 18:39:11 +0200 |
| commit | ba06627369df7c7eebc38fbefc22f2f78124f33a (patch) | |
| tree | 217cbc456affe5b39dd74ced2de48ae611ecb5c4 /Software/Visual_Studio/Tango.PMR/MessageFactory.cs | |
| parent | 860c4f663dfdd2ba7676d7e02bf0509b30389cd5 (diff) | |
| download | Tango-ba06627369df7c7eebc38fbefc22f2f78124f33a.tar.gz Tango-ba06627369df7c7eebc38fbefc22f2f78124f33a.zip | |
Improved performance of generic protobuf message decoding..
Diffstat (limited to 'Software/Visual_Studio/Tango.PMR/MessageFactory.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.PMR/MessageFactory.cs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/Software/Visual_Studio/Tango.PMR/MessageFactory.cs b/Software/Visual_Studio/Tango.PMR/MessageFactory.cs index 2c4eb3d13..b1d2a7c55 100644 --- a/Software/Visual_Studio/Tango.PMR/MessageFactory.cs +++ b/Software/Visual_Studio/Tango.PMR/MessageFactory.cs @@ -14,6 +14,27 @@ namespace Tango.PMR /// </summary> public static class MessageFactory { + private static Dictionary<MessageType, Type> _pmrTypes; + private static MethodInfo _parseTangoMessageMethod; + + static MessageFactory() + { + _parseTangoMessageMethod = typeof(MessageFactory).GetMethod("ParseTangoMessage", BindingFlags.Public | BindingFlags.Static); + + _pmrTypes = new Dictionary<MessageType, Type>(); + var types = typeof(MessageFactory).Assembly.GetTypes().ToList(); + + foreach (var value in Enum.GetValues(typeof(MessageType)).OfType<MessageType>()) + { + var type = types.SingleOrDefault(x => x.Name == value.ToOriginalName()); + + if (type != null) + { + _pmrTypes.Add(value, type); + } + } + } + /// <summary> /// Creates a new <see cref="TangoMessage{T}"/>. /// </summary> @@ -98,7 +119,7 @@ namespace Tango.PMR { MessageContainer container = MessageContainer.Parser.ParseFrom(data); IMessage message = ExtractMessageFromContainer(container); - return (ITangoMessage)typeof(MessageFactory).GetMethod("ParseTangoMessage",BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(message.GetType()).Invoke(null, new[] { data }); + return (ITangoMessage)_parseTangoMessageMethod.MakeGenericMethod(message.GetType()).Invoke(null, new[] { data }); } /// <summary> @@ -121,7 +142,7 @@ namespace Tango.PMR /// <returns></returns> public static IMessage ExtractMessageFromContainer(MessageContainer container) { - var type = typeof(MessageFactory).Assembly.GetTypes().ToList().SingleOrDefault(x => x.Name == container.Type.ToOriginalName()); + var type = _pmrTypes[container.Type]; MessageParser parser = type.GetProperty("Parser").GetValue(container) as MessageParser; return parser.ParseFrom(container.Data); } |
