RpcUtil.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Google.ProtocolBuffers {
  5. public static class RpcUtil {
  6. /// <summary>
  7. /// Converts an Action[IMessage] to an Action[T].
  8. /// </summary>
  9. public static Action<T> SpecializeCallback<T>(Action<IMessage> action)
  10. where T : IMessage<T> {
  11. return message => action(message);
  12. }
  13. /// <summary>
  14. /// Converts an Action[T] to an Action[IMessage].
  15. /// The generalized action will accept any message object which has
  16. /// the same descriptor, and will convert it to the correct class
  17. /// before calling the original action. However, if the generalized
  18. /// callback is given a message with a different descriptor, an
  19. /// exception will be thrown.
  20. /// </summary>
  21. public static Action<IMessage> GeneralizeCallback<TMessage, TBuilder>(Action<TMessage> action, TMessage defaultInstance)
  22. where TMessage : class, IMessage<TMessage, TBuilder>
  23. where TBuilder : IBuilder<TMessage, TBuilder> {
  24. return message => {
  25. TMessage castMessage = message as TMessage;
  26. if (castMessage == null) {
  27. castMessage = defaultInstance.CreateBuilderForType().MergeFrom(message).Build();
  28. }
  29. action(castMessage);
  30. };
  31. }
  32. }
  33. }