RpcUtil.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc.
  3. // http://code.google.com/p/protobuf/
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. using System;
  17. namespace Google.ProtocolBuffers {
  18. /// <summary>
  19. /// Grab-bag of utility functions useful when dealing with RPCs.
  20. /// </summary>
  21. public static class RpcUtil {
  22. /// <summary>
  23. /// Converts an Action[IMessage] to an Action[T].
  24. /// </summary>
  25. public static Action<T> SpecializeCallback<T>(Action<IMessage> action)
  26. where T : IMessage<T> {
  27. return message => action(message);
  28. }
  29. /// <summary>
  30. /// Converts an Action[T] to an Action[IMessage].
  31. /// The generalized action will accept any message object which has
  32. /// the same descriptor, and will convert it to the correct class
  33. /// before calling the original action. However, if the generalized
  34. /// callback is given a message with a different descriptor, an
  35. /// exception will be thrown.
  36. /// </summary>
  37. public static Action<IMessage> GeneralizeCallback<TMessage, TBuilder>(Action<TMessage> action, TMessage defaultInstance)
  38. where TMessage : class, IMessage<TMessage, TBuilder>
  39. where TBuilder : IBuilder<TMessage, TBuilder> {
  40. return message => {
  41. TMessage castMessage = message as TMessage;
  42. if (castMessage == null) {
  43. castMessage = defaultInstance.CreateBuilderForType().MergeFrom(message).Build();
  44. }
  45. action(castMessage);
  46. };
  47. }
  48. }
  49. }