using System; using System.Collections.Generic; using System.Text; namespace Google.ProtocolBuffers { public static class RpcUtil { /// /// Converts an Action[IMessage] to an Action[T]. /// public static Action SpecializeCallback(Action action) where T : IMessage { return message => action(message); } /// /// Converts an Action[T] to an Action[IMessage]. /// The generalized action will accept any message object which has /// the same descriptor, and will convert it to the correct class /// before calling the original action. However, if the generalized /// callback is given a message with a different descriptor, an /// exception will be thrown. /// public static Action GeneralizeCallback(Action action, TMessage defaultInstance) where TMessage : class, IMessage where TBuilder : IBuilder { return message => { TMessage castMessage = message as TMessage; if (castMessage == null) { castMessage = defaultInstance.CreateBuilderForType().MergeFrom(message).Build(); } action(castMessage); }; } } }