QbservableEx.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. #if !NO_EXPRESSIONS
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. namespace System.Reactive.Linq
  8. {
  9. /// <summary>
  10. /// Provides a set of static methods for writing queries over observable sequences, allowing translation to a target query language.
  11. /// </summary>
  12. [LocalQueryMethodImplementationType(typeof(ObservableEx))]
  13. public static partial class QbservableEx
  14. {
  15. internal static Expression GetSourceExpression<TSource>(IObservable<TSource> source)
  16. {
  17. var q = source as IQbservable<TSource>;
  18. if (q != null)
  19. return q.Expression;
  20. return Expression.Constant(source, typeof(IObservable<TSource>));
  21. }
  22. internal static Expression GetSourceExpression<TSource>(IEnumerable<TSource> source)
  23. {
  24. var q = source as IQueryable<TSource>;
  25. if (q != null)
  26. return q.Expression;
  27. return Expression.Constant(source, typeof(IEnumerable<TSource>));
  28. }
  29. internal static Expression GetSourceExpression<TSource>(IObservable<TSource>[] sources)
  30. {
  31. return Expression.NewArrayInit(
  32. typeof(IObservable<TSource>),
  33. sources.Select(source => GetSourceExpression(source))
  34. );
  35. }
  36. internal static Expression GetSourceExpression<TSource>(IEnumerable<TSource>[] sources)
  37. {
  38. return Expression.NewArrayInit(
  39. typeof(IEnumerable<TSource>),
  40. sources.Select(source => GetSourceExpression(source))
  41. );
  42. }
  43. internal static MethodInfo InfoOf<R>(Expression<Func<R>> f)
  44. {
  45. return ((MethodCallExpression)f.Body).Method;
  46. }
  47. }
  48. }
  49. #endif