Math.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Linq.Expressions;
  6. namespace System.Linq.jvm
  7. {
  8. class Math
  9. {
  10. private static readonly Type NULLABLE_TYPE = typeof(Nullable<>);
  11. public static object Evaluate(object a, object b, Type t, ExpressionType et)
  12. {
  13. TypeCode tc = Type.GetTypeCode(t);
  14. if (tc == TypeCode.Object)
  15. {
  16. if (t.GetGenericTypeDefinition() != NULLABLE_TYPE)
  17. {
  18. throw new NotImplementedException(
  19. string.Format(
  20. "Expression with Node type {0} for type {1}",
  21. t.FullName,
  22. tc));
  23. }
  24. return EvaluateNullable(a, b, Type.GetTypeCode(t.GetGenericArguments()[0]), et);
  25. }
  26. return Evaluate(a, b, tc, et);
  27. }
  28. public static object EvaluateNullable(object a, object b, TypeCode tc, ExpressionType et)
  29. {
  30. object o = null;
  31. if (a == null || b == null)
  32. {
  33. if (tc != TypeCode.Boolean)
  34. {
  35. return null;
  36. }
  37. switch (et)
  38. {
  39. case ExpressionType.And:
  40. o = And(a, b);
  41. break;
  42. case ExpressionType.Or:
  43. o = Or(a, b);
  44. break;
  45. case ExpressionType.ExclusiveOr:
  46. o = ExclusiveOr(a, b);
  47. break;
  48. }
  49. }
  50. else
  51. {
  52. o = Evaluate(a, b, tc, et);
  53. }
  54. return Convert2Nullable(o, tc);
  55. }
  56. private static object ExclusiveOr(object a, object b)
  57. {
  58. if (a == null || b == null)
  59. {
  60. return null;
  61. }
  62. return (bool)a ^ (bool)b;
  63. }
  64. public static object Or(object a, object b)
  65. {
  66. if (a == null)
  67. {
  68. if (b == null || !((bool)b))
  69. {
  70. return null;
  71. }
  72. return true;
  73. }
  74. if (b == null)
  75. {
  76. if (a == null || !((bool)a))
  77. {
  78. return null;
  79. }
  80. return true;
  81. }
  82. return (bool)a || (bool)b;
  83. }
  84. public static object And(object a, object b)
  85. {
  86. if (a == null)
  87. {
  88. if (b == null || (bool)b)
  89. {
  90. return null;
  91. }
  92. return false;
  93. }
  94. if (b == null)
  95. {
  96. if (a == null || (bool)a)
  97. {
  98. return null;
  99. }
  100. return false;
  101. }
  102. return (bool)a && (bool)b;
  103. }
  104. private static object Convert2Nullable(object o, TypeCode tc)
  105. {
  106. if (o == null)
  107. {
  108. return null;
  109. }
  110. switch (tc)
  111. {
  112. case TypeCode.Char:
  113. return new Nullable<Char>((Char)o);
  114. case TypeCode.Byte:
  115. return new Nullable<Byte>((Byte)o);
  116. case TypeCode.Decimal:
  117. return new Nullable<Decimal>((Decimal)o);
  118. case TypeCode.Double:
  119. return new Nullable<Double>((Double)o);
  120. case TypeCode.Int16:
  121. return new Nullable<Int16>((Int16)o);
  122. case TypeCode.Int32:
  123. return new Nullable<Int32>((Int32)o);
  124. case TypeCode.Int64:
  125. return new Nullable<Int64>((Int64)o);
  126. case TypeCode.UInt16:
  127. return new Nullable<UInt16>((UInt16)o);
  128. case TypeCode.UInt32:
  129. return new Nullable<UInt32>((UInt32)o);
  130. case TypeCode.SByte:
  131. return new Nullable<SByte>((SByte)o);
  132. case TypeCode.Single:
  133. return new Nullable<Single>((Single)o);
  134. case TypeCode.Boolean:
  135. return new Nullable<Boolean>((Boolean)o);
  136. }
  137. throw new NotImplementedException(
  138. string.Format("No Convert2Nullable defined for type {0} ", tc));
  139. }
  140. public static object Evaluate(object a, object b, TypeCode tc, ExpressionType et)
  141. {
  142. switch (tc)
  143. {
  144. case TypeCode.Boolean:
  145. return Evaluate(Convert.ToBoolean(a), Convert.ToBoolean(b), et);
  146. case TypeCode.Char:
  147. return Evaluate(Convert.ToChar(a), Convert.ToChar(b), et);
  148. case TypeCode.Byte:
  149. return unchecked((Byte)Evaluate(Convert.ToByte(a), Convert.ToByte(b), et));
  150. case TypeCode.Decimal:
  151. return Evaluate(Convert.ToDecimal(a), Convert.ToDecimal(b), et);
  152. case TypeCode.Double:
  153. return Evaluate(Convert.ToDouble(a), Convert.ToDouble(b), et);
  154. case TypeCode.Int16:
  155. return unchecked((Int16)Evaluate(Convert.ToInt16(a), Convert.ToInt16(b), et));
  156. case TypeCode.Int32:
  157. return Evaluate(Convert.ToInt32(a), Convert.ToInt32(b), et);
  158. case TypeCode.Int64:
  159. return Evaluate(Convert.ToInt64(a), Convert.ToInt64(b), et);
  160. case TypeCode.UInt16:
  161. return unchecked((UInt16)Evaluate(Convert.ToUInt16(a), Convert.ToUInt16(b), et));
  162. case TypeCode.UInt32:
  163. return Evaluate(Convert.ToUInt32(a), Convert.ToUInt32(b), et);
  164. case TypeCode.UInt64:
  165. return Evaluate(Convert.ToUInt64(a), Convert.ToUInt64(b), et);
  166. case TypeCode.SByte:
  167. return unchecked((SByte)Evaluate(Convert.ToSByte(a), Convert.ToSByte(b), et));
  168. case TypeCode.Single:
  169. return Evaluate(Convert.ToSingle(a), Convert.ToSingle(b), et);
  170. }
  171. throw new NotImplementedException(
  172. string.Format("Expression with Node type {0} for type {1}", et, tc));
  173. }
  174. public static object NegeteChecked(object a, TypeCode tc)
  175. {
  176. switch (tc)
  177. {
  178. case TypeCode.Char:
  179. return checked(-Convert.ToChar(a));
  180. case TypeCode.Byte:
  181. return checked(-Convert.ToByte(a));
  182. case TypeCode.Decimal:
  183. return checked(-Convert.ToDecimal(a));
  184. case TypeCode.Double:
  185. return checked(-Convert.ToDouble(a));
  186. case TypeCode.Int16:
  187. return checked(-Convert.ToInt16(a));
  188. case TypeCode.Int32:
  189. return checked(-Convert.ToInt32(a));
  190. case TypeCode.Int64:
  191. return checked(-Convert.ToInt64(a));
  192. case TypeCode.UInt16:
  193. return checked(-Convert.ToUInt16(a));
  194. case TypeCode.UInt32:
  195. return checked(-Convert.ToUInt32(a));
  196. case TypeCode.SByte:
  197. return checked(-Convert.ToSByte(a));
  198. case TypeCode.Single:
  199. return checked(-Convert.ToSingle(a));
  200. }
  201. throw new NotImplementedException(
  202. string.Format("No NegeteChecked defined for type {0} ", tc));
  203. }
  204. public static object ConvertToTypeChecked(object a, Type t)
  205. {
  206. checked
  207. {
  208. if (IsType(t, a))
  209. {
  210. return a;
  211. }
  212. }
  213. return Convert.ChangeType(a, t);
  214. }
  215. public static object ConvertToTypeUnchecked(object a, Type t)
  216. {
  217. unchecked
  218. {
  219. if (IsType(t, a))
  220. {
  221. return a;
  222. }
  223. }
  224. return ConvertToTypeUnchecked(a, Type.GetTypeCode(t));
  225. }
  226. public static bool IsType(Type t, Object o)
  227. {
  228. return t.IsInstanceOfType(o);
  229. }
  230. public static object ConvertToTypeUnchecked(object a, TypeCode tc)
  231. {
  232. switch (tc)
  233. {
  234. case TypeCode.Char:
  235. return unchecked((Char)a);
  236. case TypeCode.Byte:
  237. return unchecked((Byte)a);
  238. case TypeCode.Decimal:
  239. return unchecked((Decimal)a);
  240. case TypeCode.Double:
  241. return unchecked((Double)a);
  242. case TypeCode.Int16:
  243. return unchecked((Int16)a);
  244. case TypeCode.Int32:
  245. return unchecked((Int32)a);
  246. case TypeCode.Int64:
  247. return unchecked((Int64)a);
  248. case TypeCode.UInt16:
  249. return unchecked((UInt16)a);
  250. case TypeCode.UInt32:
  251. return unchecked((UInt32)a);
  252. case TypeCode.SByte:
  253. return unchecked((SByte)a);
  254. case TypeCode.Single:
  255. return unchecked((Single)a);
  256. case TypeCode.Boolean:
  257. return unchecked((Boolean)a);
  258. }
  259. throw new NotImplementedException(
  260. string.Format("No Convert defined for type {0} ", tc));
  261. }
  262. public static object Negete(object a, TypeCode tc)
  263. {
  264. switch (tc)
  265. {
  266. case TypeCode.Char:
  267. return unchecked(-Convert.ToChar(a));
  268. case TypeCode.Byte:
  269. return unchecked(-Convert.ToByte(a));
  270. case TypeCode.Decimal:
  271. return unchecked(-Convert.ToDecimal(a));
  272. case TypeCode.Double:
  273. return unchecked(-Convert.ToDouble(a));
  274. case TypeCode.Int16:
  275. return unchecked(-Convert.ToInt16(a));
  276. case TypeCode.Int32:
  277. return unchecked(-Convert.ToInt32(a));
  278. case TypeCode.Int64:
  279. return unchecked(-Convert.ToInt64(a));
  280. case TypeCode.UInt16:
  281. return unchecked(-Convert.ToUInt16(a));
  282. case TypeCode.UInt32:
  283. return unchecked(-Convert.ToUInt32(a));
  284. case TypeCode.SByte:
  285. return unchecked(-Convert.ToSByte(a));
  286. case TypeCode.Single:
  287. return unchecked(-Convert.ToSingle(a));
  288. }
  289. throw new NotImplementedException(
  290. string.Format("No Negete defined for type {0} ", tc));
  291. }
  292. public static object RightShift(object a, int n, TypeCode tc)
  293. {
  294. switch (tc)
  295. {
  296. case TypeCode.Int16:
  297. return Convert.ToInt16(a) >> n;
  298. case TypeCode.Int32:
  299. return Convert.ToInt32(a) >> n;
  300. case TypeCode.Int64:
  301. return Convert.ToInt64(a) >> n;
  302. case TypeCode.UInt16:
  303. return Convert.ToUInt16(a) >> n;
  304. case TypeCode.UInt32:
  305. return Convert.ToUInt32(a) >> n;
  306. case TypeCode.UInt64:
  307. return Convert.ToUInt64(a) >> n;
  308. }
  309. throw new NotImplementedException(
  310. string.Format("No right shift defined for type {0} ", tc));
  311. }
  312. public static object LeftShift(object a, int n, TypeCode tc)
  313. {
  314. switch (tc)
  315. {
  316. case TypeCode.Int16:
  317. return Convert.ToInt16(a) << n;
  318. case TypeCode.Int32:
  319. return Convert.ToInt32(a) << n;
  320. case TypeCode.Int64:
  321. return Convert.ToInt64(a) << n;
  322. case TypeCode.UInt16:
  323. return Convert.ToUInt16(a) << n;
  324. case TypeCode.UInt32:
  325. return Convert.ToUInt32(a) << n;
  326. case TypeCode.UInt64:
  327. return Convert.ToUInt64(a) << n;
  328. }
  329. throw new NotImplementedException(
  330. string.Format("No right shift defined for type {0} ", tc));
  331. }
  332. private static Decimal Evaluate(Decimal a, Decimal b, ExpressionType et)
  333. {
  334. switch (et)
  335. {
  336. case ExpressionType.Add:
  337. return unchecked(a + b);
  338. case ExpressionType.AddChecked:
  339. return checked(a + b);
  340. case ExpressionType.Subtract:
  341. return unchecked(a - b);
  342. case ExpressionType.SubtractChecked:
  343. return checked(a - b);
  344. case ExpressionType.Multiply:
  345. return unchecked(a * b);
  346. case ExpressionType.MultiplyChecked:
  347. return checked(a * b);
  348. case ExpressionType.Divide:
  349. return a / b;
  350. case ExpressionType.Modulo:
  351. return a % b;
  352. }
  353. throw new NotImplementedException(
  354. string.Format("Expression with Node type {0}", et));
  355. }
  356. private static Double Evaluate(Double a, Double b, ExpressionType et)
  357. {
  358. switch (et)
  359. {
  360. case ExpressionType.Add:
  361. return unchecked(a + b);
  362. case ExpressionType.AddChecked:
  363. return checked(a + b);
  364. case ExpressionType.Subtract:
  365. return unchecked(a - b);
  366. case ExpressionType.SubtractChecked:
  367. return checked(a - b);
  368. case ExpressionType.Multiply:
  369. return unchecked(a * b);
  370. case ExpressionType.MultiplyChecked:
  371. return checked(a * b);
  372. case ExpressionType.Divide:
  373. return a / b;
  374. case ExpressionType.Modulo:
  375. return a % b;
  376. case ExpressionType.Power:
  377. return System.Math.Pow(a, b);
  378. }
  379. throw new NotImplementedException(
  380. string.Format("Expression with Node type {0}", et));
  381. }
  382. private static Int32 Evaluate(Int16 a, Int16 b, ExpressionType et)
  383. {
  384. switch (et)
  385. {
  386. case ExpressionType.Add:
  387. return unchecked(a + b);
  388. case ExpressionType.AddChecked:
  389. return checked(a + b);
  390. case ExpressionType.Subtract:
  391. return unchecked(a - b);
  392. case ExpressionType.SubtractChecked:
  393. return checked(a - b);
  394. case ExpressionType.Multiply:
  395. return unchecked(a * b);
  396. case ExpressionType.MultiplyChecked:
  397. return checked(a * b);
  398. case ExpressionType.Divide:
  399. return a / b;
  400. case ExpressionType.Modulo:
  401. return a % b;
  402. case ExpressionType.ExclusiveOr:
  403. return a ^ b;
  404. case ExpressionType.And:
  405. return a & b;
  406. case ExpressionType.Or:
  407. return a | b;
  408. }
  409. throw new NotImplementedException(
  410. string.Format("Expression with Node type {0}", et));
  411. }
  412. private static Int32 Evaluate(Int32 a, Int32 b, ExpressionType et)
  413. {
  414. switch (et)
  415. {
  416. case ExpressionType.Add:
  417. return unchecked(a + b);
  418. case ExpressionType.AddChecked:
  419. return checked(a + b);
  420. case ExpressionType.Subtract:
  421. return unchecked(a - b);
  422. case ExpressionType.SubtractChecked:
  423. return checked(a - b);
  424. case ExpressionType.Multiply:
  425. return unchecked(a * b);
  426. case ExpressionType.MultiplyChecked:
  427. return checked(a * b);
  428. case ExpressionType.Divide:
  429. return a / b;
  430. case ExpressionType.Modulo:
  431. return a % b;
  432. case ExpressionType.ExclusiveOr:
  433. return a ^ b;
  434. case ExpressionType.And:
  435. return a & b;
  436. case ExpressionType.Or:
  437. return a | b;
  438. }
  439. throw new NotImplementedException(
  440. string.Format("Expression with Node type {0}", et));
  441. }
  442. private static Int64 Evaluate(Int64 a, Int64 b, ExpressionType et)
  443. {
  444. switch (et)
  445. {
  446. case ExpressionType.Add:
  447. return unchecked(a + b);
  448. case ExpressionType.AddChecked:
  449. return checked(a + b);
  450. case ExpressionType.Subtract:
  451. return unchecked(a - b);
  452. case ExpressionType.SubtractChecked:
  453. return checked(a - b);
  454. case ExpressionType.Multiply:
  455. return unchecked(a * b);
  456. case ExpressionType.MultiplyChecked:
  457. return checked(a * b);
  458. case ExpressionType.Divide:
  459. return a / b;
  460. case ExpressionType.Modulo:
  461. return a % b;
  462. case ExpressionType.ExclusiveOr:
  463. return a ^ b;
  464. case ExpressionType.And:
  465. return a & b;
  466. case ExpressionType.Or:
  467. return a | b;
  468. }
  469. throw new NotImplementedException(
  470. string.Format("Expression with Node type {0}", et));
  471. }
  472. private static Int32 Evaluate(UInt16 a, UInt16 b, ExpressionType et)
  473. {
  474. switch (et)
  475. {
  476. case ExpressionType.Add:
  477. return unchecked(a + b);
  478. case ExpressionType.AddChecked:
  479. return checked(a + b);
  480. case ExpressionType.Subtract:
  481. return unchecked(a - b);
  482. case ExpressionType.SubtractChecked:
  483. return checked((UInt16)(a - b));
  484. case ExpressionType.Multiply:
  485. return unchecked(a * b);
  486. case ExpressionType.MultiplyChecked:
  487. return checked(a * b);
  488. case ExpressionType.Divide:
  489. return a / b;
  490. case ExpressionType.Modulo:
  491. return a % b;
  492. case ExpressionType.ExclusiveOr:
  493. return a ^ b;
  494. case ExpressionType.And:
  495. return a & b;
  496. case ExpressionType.Or:
  497. return a | b;
  498. }
  499. throw new NotImplementedException(
  500. string.Format("Expression with Node type {0}", et));
  501. }
  502. private static UInt32 Evaluate(UInt32 a, UInt32 b, ExpressionType et)
  503. {
  504. switch (et)
  505. {
  506. case ExpressionType.Add:
  507. return unchecked(a + b);
  508. case ExpressionType.AddChecked:
  509. return checked(a + b);
  510. case ExpressionType.Subtract:
  511. return unchecked(a - b);
  512. case ExpressionType.SubtractChecked:
  513. return checked(a - b);
  514. case ExpressionType.Multiply:
  515. return unchecked(a * b);
  516. case ExpressionType.MultiplyChecked:
  517. return checked(a * b);
  518. case ExpressionType.Divide:
  519. return a / b;
  520. case ExpressionType.Modulo:
  521. return a % b;
  522. case ExpressionType.ExclusiveOr:
  523. return a ^ b;
  524. case ExpressionType.And:
  525. return a & b;
  526. case ExpressionType.Or:
  527. return a | b;
  528. }
  529. throw new NotImplementedException(
  530. string.Format("Expression with Node type {0}", et));
  531. }
  532. private static UInt64 Evaluate(UInt64 a, UInt64 b, ExpressionType et)
  533. {
  534. switch (et)
  535. {
  536. case ExpressionType.Add:
  537. return unchecked(a + b);
  538. case ExpressionType.AddChecked:
  539. return checked(a + b);
  540. case ExpressionType.Subtract:
  541. return unchecked(a - b);
  542. case ExpressionType.SubtractChecked:
  543. return checked(a - b);
  544. case ExpressionType.Multiply:
  545. return unchecked(a * b);
  546. case ExpressionType.MultiplyChecked:
  547. return checked(a * b);
  548. case ExpressionType.Divide:
  549. return a / b;
  550. case ExpressionType.Modulo:
  551. return a % b;
  552. case ExpressionType.ExclusiveOr:
  553. return a ^ b;
  554. case ExpressionType.And:
  555. return a & b;
  556. case ExpressionType.Or:
  557. return a | b;
  558. }
  559. throw new NotImplementedException(
  560. string.Format("Expression with Node type {0}", et));
  561. }
  562. private static object Evaluate(Char a, Char b, ExpressionType et)
  563. {
  564. switch (et)
  565. {
  566. case ExpressionType.ExclusiveOr:
  567. return a ^ b;
  568. case ExpressionType.And:
  569. return a & b;
  570. case ExpressionType.Or:
  571. return a | b;
  572. }
  573. throw new NotImplementedException(
  574. string.Format("Expression with Node type {0}", et));
  575. }
  576. private static Int32 Evaluate(SByte a, SByte b, ExpressionType et)
  577. {
  578. switch (et)
  579. {
  580. case ExpressionType.Add:
  581. return unchecked(a + b);
  582. case ExpressionType.AddChecked:
  583. return checked(a + b);
  584. case ExpressionType.Subtract:
  585. return unchecked(a - b);
  586. case ExpressionType.SubtractChecked:
  587. return checked(a - b);
  588. case ExpressionType.Multiply:
  589. return unchecked(a * b);
  590. case ExpressionType.MultiplyChecked:
  591. return checked(a * b);
  592. case ExpressionType.Divide:
  593. return a / b;
  594. case ExpressionType.Modulo:
  595. return a % b;
  596. case ExpressionType.ExclusiveOr:
  597. return a ^ b;
  598. case ExpressionType.And:
  599. return a & b;
  600. case ExpressionType.Or:
  601. return a | b;
  602. }
  603. throw new NotImplementedException(
  604. string.Format("Expression with Node type {0}", et));
  605. }
  606. private static Int32 Evaluate(Byte a, Byte b, ExpressionType et)
  607. {
  608. switch (et)
  609. {
  610. case ExpressionType.Add:
  611. return unchecked(a + b);
  612. case ExpressionType.AddChecked:
  613. return checked(a + b);
  614. case ExpressionType.Subtract:
  615. return unchecked(a - b);
  616. case ExpressionType.SubtractChecked:
  617. return checked(a - b);
  618. case ExpressionType.Multiply:
  619. return unchecked(a * b);
  620. case ExpressionType.MultiplyChecked:
  621. return checked(a * b);
  622. case ExpressionType.Divide:
  623. return a / b;
  624. case ExpressionType.Modulo:
  625. return a % b;
  626. case ExpressionType.ExclusiveOr:
  627. return a ^ b;
  628. case ExpressionType.And:
  629. return a & b;
  630. case ExpressionType.Or:
  631. return a | b;
  632. }
  633. throw new NotImplementedException(
  634. string.Format("Expression with Node type {0}", et));
  635. }
  636. private static Single Evaluate(Single a, Single b, ExpressionType et)
  637. {
  638. switch (et)
  639. {
  640. case ExpressionType.Add:
  641. return unchecked(a + b);
  642. case ExpressionType.AddChecked:
  643. return checked(a + b);
  644. case ExpressionType.Subtract:
  645. return unchecked(a - b);
  646. case ExpressionType.SubtractChecked:
  647. return checked(a - b);
  648. case ExpressionType.Multiply:
  649. return unchecked(a * b);
  650. case ExpressionType.MultiplyChecked:
  651. return checked(a * b);
  652. case ExpressionType.Divide:
  653. return a / b;
  654. case ExpressionType.Modulo:
  655. return a % b;
  656. }
  657. throw new NotImplementedException(
  658. string.Format("Expression with Node type {0}", et));
  659. }
  660. private static bool Evaluate(bool a, bool b, ExpressionType et)
  661. {
  662. switch (et)
  663. {
  664. case ExpressionType.ExclusiveOr:
  665. return a ^ b;
  666. case ExpressionType.And:
  667. return a & b;
  668. case ExpressionType.Or:
  669. return a | b;
  670. }
  671. throw new NotImplementedException(
  672. string.Format("Expression with Node type {0}", et));
  673. }
  674. }
  675. }