PageRenderTime 49ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 1ms

/ReactiveUI/VariadicTemplates.cs

https://github.com/bsiegel/ReactiveUI
C# | 1656 lines | 1401 code | 87 blank | 168 comment | 12 complexity | bb7b1dac87d1e5744450637a1c36616c MD5 | raw file
Possible License(s): Apache-2.0, CC-BY-SA-3.0, LGPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reactive.Disposables;
  4. using System.Reactive.Linq;
  5. using System.Diagnostics.Contracts;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Reflection;
  9. using System.Text;
  10. namespace ReactiveUI
  11. {
  12. public static class WhenAnyMixin
  13. {
  14. /// <summary>
  15. /// WhenAny allows you to observe whenever one or more properties on an
  16. /// object have changed, providing an initial value when the Observable
  17. /// is set up, unlike ObservableForProperty(). Use this method in
  18. /// constructors to set up bindings between properties that also need an
  19. /// initial setup.
  20. /// </summary>
  21. public static IObservable<TRet> WhenAny<TSender, TRet, T1>(this TSender This,
  22. Expression<Func<TSender, T1>> property1,
  23. Func<IObservedChange<TSender, T1>, TRet> selector)
  24. {
  25. bool allInputsWorked = true;
  26. var slot1 = new ObservedChange<TSender, T1>() {
  27. Sender = This,
  28. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  29. };
  30. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  31. IObservedChange<TSender, T1> islot1 = slot1;
  32. return Observable.Create<TRet>(subject => {
  33. if (allInputsWorked) subject.OnNext(selector(islot1));
  34. return Observable.Merge(
  35. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1))
  36. ).Subscribe(subject);
  37. });
  38. }
  39. /// <summary>
  40. /// WhenAny allows you to observe whenever one or more properties on an
  41. /// object have changed, providing an initial value when the Observable
  42. /// is set up, unlike ObservableForProperty(). Use this method in
  43. /// constructors to set up bindings between properties that also need an
  44. /// initial setup.
  45. /// </summary>
  46. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  47. string[] property1,
  48. Func<IObservedChange<TSender, object>, TRet> selector)
  49. {
  50. var slot1 = new ObservedChange<TSender, object>() {
  51. Sender = This,
  52. PropertyName = String.Join(".", property1),
  53. };
  54. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  55. IObservedChange<TSender, object> islot1 = slot1;
  56. return Observable.Create<TRet>(subject => {
  57. subject.OnNext(selector(islot1));
  58. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1)) ).Subscribe(subject);
  59. });
  60. }
  61. /// <summary>
  62. /// WhenAny allows you to observe whenever one or more properties on an
  63. /// object have changed, providing an initial value when the Observable
  64. /// is set up, unlike ObservableForProperty(). Use this method in
  65. /// constructors to set up bindings between properties that also need an
  66. /// initial setup.
  67. /// </summary>
  68. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2>(this TSender This,
  69. Expression<Func<TSender, T1>> property1,
  70. Expression<Func<TSender, T2>> property2,
  71. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, TRet> selector)
  72. {
  73. bool allInputsWorked = true;
  74. var slot1 = new ObservedChange<TSender, T1>() {
  75. Sender = This,
  76. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  77. };
  78. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  79. IObservedChange<TSender, T1> islot1 = slot1;
  80. var slot2 = new ObservedChange<TSender, T2>() {
  81. Sender = This,
  82. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  83. };
  84. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  85. IObservedChange<TSender, T2> islot2 = slot2;
  86. return Observable.Create<TRet>(subject => {
  87. if (allInputsWorked) subject.OnNext(selector(islot1, islot2));
  88. return Observable.Merge(
  89. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2)),
  90. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2))
  91. ).Subscribe(subject);
  92. });
  93. }
  94. /// <summary>
  95. /// WhenAny allows you to observe whenever one or more properties on an
  96. /// object have changed, providing an initial value when the Observable
  97. /// is set up, unlike ObservableForProperty(). Use this method in
  98. /// constructors to set up bindings between properties that also need an
  99. /// initial setup.
  100. /// </summary>
  101. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  102. string[] property1,
  103. string[] property2,
  104. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  105. {
  106. var slot1 = new ObservedChange<TSender, object>() {
  107. Sender = This,
  108. PropertyName = String.Join(".", property1),
  109. };
  110. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  111. IObservedChange<TSender, object> islot1 = slot1;
  112. var slot2 = new ObservedChange<TSender, object>() {
  113. Sender = This,
  114. PropertyName = String.Join(".", property2),
  115. };
  116. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  117. IObservedChange<TSender, object> islot2 = slot2;
  118. return Observable.Create<TRet>(subject => {
  119. subject.OnNext(selector(islot1, islot2));
  120. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2)) ).Subscribe(subject);
  121. });
  122. }
  123. /// <summary>
  124. /// WhenAny allows you to observe whenever one or more properties on an
  125. /// object have changed, providing an initial value when the Observable
  126. /// is set up, unlike ObservableForProperty(). Use this method in
  127. /// constructors to set up bindings between properties that also need an
  128. /// initial setup.
  129. /// </summary>
  130. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3>(this TSender This,
  131. Expression<Func<TSender, T1>> property1,
  132. Expression<Func<TSender, T2>> property2,
  133. Expression<Func<TSender, T3>> property3,
  134. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, TRet> selector)
  135. {
  136. bool allInputsWorked = true;
  137. var slot1 = new ObservedChange<TSender, T1>() {
  138. Sender = This,
  139. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  140. };
  141. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  142. IObservedChange<TSender, T1> islot1 = slot1;
  143. var slot2 = new ObservedChange<TSender, T2>() {
  144. Sender = This,
  145. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  146. };
  147. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  148. IObservedChange<TSender, T2> islot2 = slot2;
  149. var slot3 = new ObservedChange<TSender, T3>() {
  150. Sender = This,
  151. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  152. };
  153. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  154. IObservedChange<TSender, T3> islot3 = slot3;
  155. return Observable.Create<TRet>(subject => {
  156. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3));
  157. return Observable.Merge(
  158. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)),
  159. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)),
  160. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3))
  161. ).Subscribe(subject);
  162. });
  163. }
  164. /// <summary>
  165. /// WhenAny allows you to observe whenever one or more properties on an
  166. /// object have changed, providing an initial value when the Observable
  167. /// is set up, unlike ObservableForProperty(). Use this method in
  168. /// constructors to set up bindings between properties that also need an
  169. /// initial setup.
  170. /// </summary>
  171. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  172. string[] property1,
  173. string[] property2,
  174. string[] property3,
  175. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  176. {
  177. var slot1 = new ObservedChange<TSender, object>() {
  178. Sender = This,
  179. PropertyName = String.Join(".", property1),
  180. };
  181. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  182. IObservedChange<TSender, object> islot1 = slot1;
  183. var slot2 = new ObservedChange<TSender, object>() {
  184. Sender = This,
  185. PropertyName = String.Join(".", property2),
  186. };
  187. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  188. IObservedChange<TSender, object> islot2 = slot2;
  189. var slot3 = new ObservedChange<TSender, object>() {
  190. Sender = This,
  191. PropertyName = String.Join(".", property3),
  192. };
  193. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  194. IObservedChange<TSender, object> islot3 = slot3;
  195. return Observable.Create<TRet>(subject => {
  196. subject.OnNext(selector(islot1, islot2, islot3));
  197. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3)) ).Subscribe(subject);
  198. });
  199. }
  200. /// <summary>
  201. /// WhenAny allows you to observe whenever one or more properties on an
  202. /// object have changed, providing an initial value when the Observable
  203. /// is set up, unlike ObservableForProperty(). Use this method in
  204. /// constructors to set up bindings between properties that also need an
  205. /// initial setup.
  206. /// </summary>
  207. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4>(this TSender This,
  208. Expression<Func<TSender, T1>> property1,
  209. Expression<Func<TSender, T2>> property2,
  210. Expression<Func<TSender, T3>> property3,
  211. Expression<Func<TSender, T4>> property4,
  212. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, TRet> selector)
  213. {
  214. bool allInputsWorked = true;
  215. var slot1 = new ObservedChange<TSender, T1>() {
  216. Sender = This,
  217. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  218. };
  219. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  220. IObservedChange<TSender, T1> islot1 = slot1;
  221. var slot2 = new ObservedChange<TSender, T2>() {
  222. Sender = This,
  223. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  224. };
  225. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  226. IObservedChange<TSender, T2> islot2 = slot2;
  227. var slot3 = new ObservedChange<TSender, T3>() {
  228. Sender = This,
  229. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  230. };
  231. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  232. IObservedChange<TSender, T3> islot3 = slot3;
  233. var slot4 = new ObservedChange<TSender, T4>() {
  234. Sender = This,
  235. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  236. };
  237. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  238. IObservedChange<TSender, T4> islot4 = slot4;
  239. return Observable.Create<TRet>(subject => {
  240. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4));
  241. return Observable.Merge(
  242. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)),
  243. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)),
  244. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)),
  245. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4))
  246. ).Subscribe(subject);
  247. });
  248. }
  249. /// <summary>
  250. /// WhenAny allows you to observe whenever one or more properties on an
  251. /// object have changed, providing an initial value when the Observable
  252. /// is set up, unlike ObservableForProperty(). Use this method in
  253. /// constructors to set up bindings between properties that also need an
  254. /// initial setup.
  255. /// </summary>
  256. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  257. string[] property1,
  258. string[] property2,
  259. string[] property3,
  260. string[] property4,
  261. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  262. {
  263. var slot1 = new ObservedChange<TSender, object>() {
  264. Sender = This,
  265. PropertyName = String.Join(".", property1),
  266. };
  267. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  268. IObservedChange<TSender, object> islot1 = slot1;
  269. var slot2 = new ObservedChange<TSender, object>() {
  270. Sender = This,
  271. PropertyName = String.Join(".", property2),
  272. };
  273. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  274. IObservedChange<TSender, object> islot2 = slot2;
  275. var slot3 = new ObservedChange<TSender, object>() {
  276. Sender = This,
  277. PropertyName = String.Join(".", property3),
  278. };
  279. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  280. IObservedChange<TSender, object> islot3 = slot3;
  281. var slot4 = new ObservedChange<TSender, object>() {
  282. Sender = This,
  283. PropertyName = String.Join(".", property4),
  284. };
  285. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  286. IObservedChange<TSender, object> islot4 = slot4;
  287. return Observable.Create<TRet>(subject => {
  288. subject.OnNext(selector(islot1, islot2, islot3, islot4));
  289. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4)) ).Subscribe(subject);
  290. });
  291. }
  292. /// <summary>
  293. /// WhenAny allows you to observe whenever one or more properties on an
  294. /// object have changed, providing an initial value when the Observable
  295. /// is set up, unlike ObservableForProperty(). Use this method in
  296. /// constructors to set up bindings between properties that also need an
  297. /// initial setup.
  298. /// </summary>
  299. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5>(this TSender This,
  300. Expression<Func<TSender, T1>> property1,
  301. Expression<Func<TSender, T2>> property2,
  302. Expression<Func<TSender, T3>> property3,
  303. Expression<Func<TSender, T4>> property4,
  304. Expression<Func<TSender, T5>> property5,
  305. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, TRet> selector)
  306. {
  307. bool allInputsWorked = true;
  308. var slot1 = new ObservedChange<TSender, T1>() {
  309. Sender = This,
  310. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  311. };
  312. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  313. IObservedChange<TSender, T1> islot1 = slot1;
  314. var slot2 = new ObservedChange<TSender, T2>() {
  315. Sender = This,
  316. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  317. };
  318. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  319. IObservedChange<TSender, T2> islot2 = slot2;
  320. var slot3 = new ObservedChange<TSender, T3>() {
  321. Sender = This,
  322. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  323. };
  324. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  325. IObservedChange<TSender, T3> islot3 = slot3;
  326. var slot4 = new ObservedChange<TSender, T4>() {
  327. Sender = This,
  328. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  329. };
  330. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  331. IObservedChange<TSender, T4> islot4 = slot4;
  332. var slot5 = new ObservedChange<TSender, T5>() {
  333. Sender = This,
  334. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  335. };
  336. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  337. IObservedChange<TSender, T5> islot5 = slot5;
  338. return Observable.Create<TRet>(subject => {
  339. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5));
  340. return Observable.Merge(
  341. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  342. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  343. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  344. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)),
  345. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5))
  346. ).Subscribe(subject);
  347. });
  348. }
  349. /// <summary>
  350. /// WhenAny allows you to observe whenever one or more properties on an
  351. /// object have changed, providing an initial value when the Observable
  352. /// is set up, unlike ObservableForProperty(). Use this method in
  353. /// constructors to set up bindings between properties that also need an
  354. /// initial setup.
  355. /// </summary>
  356. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  357. string[] property1,
  358. string[] property2,
  359. string[] property3,
  360. string[] property4,
  361. string[] property5,
  362. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  363. {
  364. var slot1 = new ObservedChange<TSender, object>() {
  365. Sender = This,
  366. PropertyName = String.Join(".", property1),
  367. };
  368. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  369. IObservedChange<TSender, object> islot1 = slot1;
  370. var slot2 = new ObservedChange<TSender, object>() {
  371. Sender = This,
  372. PropertyName = String.Join(".", property2),
  373. };
  374. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  375. IObservedChange<TSender, object> islot2 = slot2;
  376. var slot3 = new ObservedChange<TSender, object>() {
  377. Sender = This,
  378. PropertyName = String.Join(".", property3),
  379. };
  380. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  381. IObservedChange<TSender, object> islot3 = slot3;
  382. var slot4 = new ObservedChange<TSender, object>() {
  383. Sender = This,
  384. PropertyName = String.Join(".", property4),
  385. };
  386. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  387. IObservedChange<TSender, object> islot4 = slot4;
  388. var slot5 = new ObservedChange<TSender, object>() {
  389. Sender = This,
  390. PropertyName = String.Join(".", property5),
  391. };
  392. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  393. IObservedChange<TSender, object> islot5 = slot5;
  394. return Observable.Create<TRet>(subject => {
  395. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5));
  396. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5)) ).Subscribe(subject);
  397. });
  398. }
  399. /// <summary>
  400. /// WhenAny allows you to observe whenever one or more properties on an
  401. /// object have changed, providing an initial value when the Observable
  402. /// is set up, unlike ObservableForProperty(). Use this method in
  403. /// constructors to set up bindings between properties that also need an
  404. /// initial setup.
  405. /// </summary>
  406. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6>(this TSender This,
  407. Expression<Func<TSender, T1>> property1,
  408. Expression<Func<TSender, T2>> property2,
  409. Expression<Func<TSender, T3>> property3,
  410. Expression<Func<TSender, T4>> property4,
  411. Expression<Func<TSender, T5>> property5,
  412. Expression<Func<TSender, T6>> property6,
  413. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, TRet> selector)
  414. {
  415. bool allInputsWorked = true;
  416. var slot1 = new ObservedChange<TSender, T1>() {
  417. Sender = This,
  418. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  419. };
  420. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  421. IObservedChange<TSender, T1> islot1 = slot1;
  422. var slot2 = new ObservedChange<TSender, T2>() {
  423. Sender = This,
  424. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  425. };
  426. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  427. IObservedChange<TSender, T2> islot2 = slot2;
  428. var slot3 = new ObservedChange<TSender, T3>() {
  429. Sender = This,
  430. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  431. };
  432. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  433. IObservedChange<TSender, T3> islot3 = slot3;
  434. var slot4 = new ObservedChange<TSender, T4>() {
  435. Sender = This,
  436. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  437. };
  438. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  439. IObservedChange<TSender, T4> islot4 = slot4;
  440. var slot5 = new ObservedChange<TSender, T5>() {
  441. Sender = This,
  442. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  443. };
  444. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  445. IObservedChange<TSender, T5> islot5 = slot5;
  446. var slot6 = new ObservedChange<TSender, T6>() {
  447. Sender = This,
  448. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  449. };
  450. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  451. IObservedChange<TSender, T6> islot6 = slot6;
  452. return Observable.Create<TRet>(subject => {
  453. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6));
  454. return Observable.Merge(
  455. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  456. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  457. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  458. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  459. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)),
  460. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6))
  461. ).Subscribe(subject);
  462. });
  463. }
  464. /// <summary>
  465. /// WhenAny allows you to observe whenever one or more properties on an
  466. /// object have changed, providing an initial value when the Observable
  467. /// is set up, unlike ObservableForProperty(). Use this method in
  468. /// constructors to set up bindings between properties that also need an
  469. /// initial setup.
  470. /// </summary>
  471. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  472. string[] property1,
  473. string[] property2,
  474. string[] property3,
  475. string[] property4,
  476. string[] property5,
  477. string[] property6,
  478. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  479. {
  480. var slot1 = new ObservedChange<TSender, object>() {
  481. Sender = This,
  482. PropertyName = String.Join(".", property1),
  483. };
  484. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  485. IObservedChange<TSender, object> islot1 = slot1;
  486. var slot2 = new ObservedChange<TSender, object>() {
  487. Sender = This,
  488. PropertyName = String.Join(".", property2),
  489. };
  490. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  491. IObservedChange<TSender, object> islot2 = slot2;
  492. var slot3 = new ObservedChange<TSender, object>() {
  493. Sender = This,
  494. PropertyName = String.Join(".", property3),
  495. };
  496. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  497. IObservedChange<TSender, object> islot3 = slot3;
  498. var slot4 = new ObservedChange<TSender, object>() {
  499. Sender = This,
  500. PropertyName = String.Join(".", property4),
  501. };
  502. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  503. IObservedChange<TSender, object> islot4 = slot4;
  504. var slot5 = new ObservedChange<TSender, object>() {
  505. Sender = This,
  506. PropertyName = String.Join(".", property5),
  507. };
  508. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  509. IObservedChange<TSender, object> islot5 = slot5;
  510. var slot6 = new ObservedChange<TSender, object>() {
  511. Sender = This,
  512. PropertyName = String.Join(".", property6),
  513. };
  514. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  515. IObservedChange<TSender, object> islot6 = slot6;
  516. return Observable.Create<TRet>(subject => {
  517. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6));
  518. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6)) ).Subscribe(subject);
  519. });
  520. }
  521. /// <summary>
  522. /// WhenAny allows you to observe whenever one or more properties on an
  523. /// object have changed, providing an initial value when the Observable
  524. /// is set up, unlike ObservableForProperty(). Use this method in
  525. /// constructors to set up bindings between properties that also need an
  526. /// initial setup.
  527. /// </summary>
  528. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7>(this TSender This,
  529. Expression<Func<TSender, T1>> property1,
  530. Expression<Func<TSender, T2>> property2,
  531. Expression<Func<TSender, T3>> property3,
  532. Expression<Func<TSender, T4>> property4,
  533. Expression<Func<TSender, T5>> property5,
  534. Expression<Func<TSender, T6>> property6,
  535. Expression<Func<TSender, T7>> property7,
  536. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, TRet> selector)
  537. {
  538. bool allInputsWorked = true;
  539. var slot1 = new ObservedChange<TSender, T1>() {
  540. Sender = This,
  541. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  542. };
  543. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  544. IObservedChange<TSender, T1> islot1 = slot1;
  545. var slot2 = new ObservedChange<TSender, T2>() {
  546. Sender = This,
  547. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  548. };
  549. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  550. IObservedChange<TSender, T2> islot2 = slot2;
  551. var slot3 = new ObservedChange<TSender, T3>() {
  552. Sender = This,
  553. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  554. };
  555. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  556. IObservedChange<TSender, T3> islot3 = slot3;
  557. var slot4 = new ObservedChange<TSender, T4>() {
  558. Sender = This,
  559. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  560. };
  561. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  562. IObservedChange<TSender, T4> islot4 = slot4;
  563. var slot5 = new ObservedChange<TSender, T5>() {
  564. Sender = This,
  565. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  566. };
  567. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  568. IObservedChange<TSender, T5> islot5 = slot5;
  569. var slot6 = new ObservedChange<TSender, T6>() {
  570. Sender = This,
  571. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  572. };
  573. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  574. IObservedChange<TSender, T6> islot6 = slot6;
  575. var slot7 = new ObservedChange<TSender, T7>() {
  576. Sender = This,
  577. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  578. };
  579. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  580. IObservedChange<TSender, T7> islot7 = slot7;
  581. return Observable.Create<TRet>(subject => {
  582. if (allInputsWorked) subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7));
  583. return Observable.Merge(
  584. This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  585. This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  586. This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  587. This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  588. This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  589. This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)),
  590. This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7))
  591. ).Subscribe(subject);
  592. });
  593. }
  594. /// <summary>
  595. /// WhenAny allows you to observe whenever one or more properties on an
  596. /// object have changed, providing an initial value when the Observable
  597. /// is set up, unlike ObservableForProperty(). Use this method in
  598. /// constructors to set up bindings between properties that also need an
  599. /// initial setup.
  600. /// </summary>
  601. public static IObservable<TRet> WhenAnyDynamic<TSender, TRet>(this TSender This,
  602. string[] property1,
  603. string[] property2,
  604. string[] property3,
  605. string[] property4,
  606. string[] property5,
  607. string[] property6,
  608. string[] property7,
  609. Func<IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, IObservedChange<TSender, object>, TRet> selector)
  610. {
  611. var slot1 = new ObservedChange<TSender, object>() {
  612. Sender = This,
  613. PropertyName = String.Join(".", property1),
  614. };
  615. object slot1Value = default(object); slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  616. IObservedChange<TSender, object> islot1 = slot1;
  617. var slot2 = new ObservedChange<TSender, object>() {
  618. Sender = This,
  619. PropertyName = String.Join(".", property2),
  620. };
  621. object slot2Value = default(object); slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  622. IObservedChange<TSender, object> islot2 = slot2;
  623. var slot3 = new ObservedChange<TSender, object>() {
  624. Sender = This,
  625. PropertyName = String.Join(".", property3),
  626. };
  627. object slot3Value = default(object); slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  628. IObservedChange<TSender, object> islot3 = slot3;
  629. var slot4 = new ObservedChange<TSender, object>() {
  630. Sender = This,
  631. PropertyName = String.Join(".", property4),
  632. };
  633. object slot4Value = default(object); slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  634. IObservedChange<TSender, object> islot4 = slot4;
  635. var slot5 = new ObservedChange<TSender, object>() {
  636. Sender = This,
  637. PropertyName = String.Join(".", property5),
  638. };
  639. object slot5Value = default(object); slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  640. IObservedChange<TSender, object> islot5 = slot5;
  641. var slot6 = new ObservedChange<TSender, object>() {
  642. Sender = This,
  643. PropertyName = String.Join(".", property6),
  644. };
  645. object slot6Value = default(object); slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  646. IObservedChange<TSender, object> islot6 = slot6;
  647. var slot7 = new ObservedChange<TSender, object>() {
  648. Sender = This,
  649. PropertyName = String.Join(".", property7),
  650. };
  651. object slot7Value = default(object); slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  652. IObservedChange<TSender, object> islot7 = slot7;
  653. return Observable.Create<TRet>(subject => {
  654. subject.OnNext(selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7));
  655. return Observable.Merge( This.ObservableForProperty(property1).Do(x => { lock (slot1) { islot1 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property2).Do(x => { lock (slot2) { islot2 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property3).Do(x => { lock (slot3) { islot3 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property4).Do(x => { lock (slot4) { islot4 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property5).Do(x => { lock (slot5) { islot5 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property6).Do(x => { lock (slot6) { islot6 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)), This.ObservableForProperty(property7).Do(x => { lock (slot7) { islot7 = x.fillInValue(); } }).Select(x => selector(islot1, islot2, islot3, islot4, islot5, islot6, islot7)) ).Subscribe(subject);
  656. });
  657. }
  658. /// <summary>
  659. /// WhenAny allows you to observe whenever one or more properties on an
  660. /// object have changed, providing an initial value when the Observable
  661. /// is set up, unlike ObservableForProperty(). Use this method in
  662. /// constructors to set up bindings between properties that also need an
  663. /// initial setup.
  664. /// </summary>
  665. public static IObservable<TRet> WhenAny<TSender, TRet, T1,T2,T3,T4,T5,T6,T7,T8>(this TSender This,
  666. Expression<Func<TSender, T1>> property1,
  667. Expression<Func<TSender, T2>> property2,
  668. Expression<Func<TSender, T3>> property3,
  669. Expression<Func<TSender, T4>> property4,
  670. Expression<Func<TSender, T5>> property5,
  671. Expression<Func<TSender, T6>> property6,
  672. Expression<Func<TSender, T7>> property7,
  673. Expression<Func<TSender, T8>> property8,
  674. Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, TRet> selector)
  675. {
  676. bool allInputsWorked = true;
  677. var slot1 = new ObservedChange<TSender, T1>() {
  678. Sender = This,
  679. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property1)),
  680. };
  681. T1 slot1Value = default(T1); allInputsWorked &= slot1.TryGetValue(out slot1Value); slot1.Value = slot1Value;
  682. IObservedChange<TSender, T1> islot1 = slot1;
  683. var slot2 = new ObservedChange<TSender, T2>() {
  684. Sender = This,
  685. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property2)),
  686. };
  687. T2 slot2Value = default(T2); allInputsWorked &= slot2.TryGetValue(out slot2Value); slot2.Value = slot2Value;
  688. IObservedChange<TSender, T2> islot2 = slot2;
  689. var slot3 = new ObservedChange<TSender, T3>() {
  690. Sender = This,
  691. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property3)),
  692. };
  693. T3 slot3Value = default(T3); allInputsWorked &= slot3.TryGetValue(out slot3Value); slot3.Value = slot3Value;
  694. IObservedChange<TSender, T3> islot3 = slot3;
  695. var slot4 = new ObservedChange<TSender, T4>() {
  696. Sender = This,
  697. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property4)),
  698. };
  699. T4 slot4Value = default(T4); allInputsWorked &= slot4.TryGetValue(out slot4Value); slot4.Value = slot4Value;
  700. IObservedChange<TSender, T4> islot4 = slot4;
  701. var slot5 = new ObservedChange<TSender, T5>() {
  702. Sender = This,
  703. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property5)),
  704. };
  705. T5 slot5Value = default(T5); allInputsWorked &= slot5.TryGetValue(out slot5Value); slot5.Value = slot5Value;
  706. IObservedChange<TSender, T5> islot5 = slot5;
  707. var slot6 = new ObservedChange<TSender, T6>() {
  708. Sender = This,
  709. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property6)),
  710. };
  711. T6 slot6Value = default(T6); allInputsWorked &= slot6.TryGetValue(out slot6Value); slot6.Value = slot6Value;
  712. IObservedChange<TSender, T6> islot6 = slot6;
  713. var slot7 = new ObservedChange<TSender, T7>() {
  714. Sender = This,
  715. PropertyName = String.Join(".", Reflection.ExpressionToPropertyNames(property7)),
  716. };
  717. T7 slot7Value = default(T7); allInputsWorked &= slot7.TryGetValue(out slot7Value); slot7.Value = slot7Value;
  718. IObservedChange<TSender, T7> islot7 = slot7;
  719. var slot8 = new ObservedChange<TSender, T8>() {

Large files files are truncated, but you can click here to view the full file