PageRenderTime 48ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/FluentNHibernate/Utils/Reflection/PropertyChain.cs

http://github.com/jagregory/fluent-nhibernate
C# | 107 lines | 87 code | 20 blank | 0 comment | 7 complexity | c2fe45aa9ce919d4239b462d4c9a887d MD5 | raw file
Possible License(s): BSD-3-Clause, CC-BY-SA-3.0, Apache-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq.Expressions;
  4. using System.Reflection;
  5. using FluentNHibernate.Mapping;
  6. namespace FluentNHibernate.Utils
  7. {
  8. public class PropertyChain : Accessor
  9. {
  10. private readonly Member[] _chain;
  11. private readonly SingleMember innerMember;
  12. public PropertyChain(Member[] members)
  13. {
  14. _chain = new Member[members.Length - 1];
  15. for (int i = 0; i < _chain.Length; i++)
  16. {
  17. _chain[i] = members[i];
  18. }
  19. innerMember = new SingleMember(members[members.Length - 1]);
  20. }
  21. #region Accessor Members
  22. public void SetValue(object target, object propertyValue)
  23. {
  24. target = findInnerMostTarget(target);
  25. if (target == null)
  26. {
  27. return;
  28. }
  29. innerMember.SetValue(target, propertyValue);
  30. }
  31. public object GetValue(object target)
  32. {
  33. target = findInnerMostTarget(target);
  34. if (target == null)
  35. {
  36. return null;
  37. }
  38. return innerMember.GetValue(target);
  39. }
  40. public string FieldName
  41. {
  42. get { return innerMember.FieldName; }
  43. }
  44. public Type PropertyType
  45. {
  46. get { return innerMember.PropertyType; }
  47. }
  48. public Member InnerMember
  49. {
  50. get { return innerMember.InnerMember; }
  51. }
  52. public Accessor GetChildAccessor<T>(Expression<Func<T, object>> expression)
  53. {
  54. var member = expression.ToMember();
  55. var list = new List<Member>(_chain);
  56. list.Add(innerMember.InnerMember);
  57. list.Add(member);
  58. return new PropertyChain(list.ToArray());
  59. }
  60. public string Name
  61. {
  62. get
  63. {
  64. string returnValue = string.Empty;
  65. foreach (var info in _chain)
  66. {
  67. returnValue += info.Name + ".";
  68. }
  69. returnValue += innerMember.Name;
  70. return returnValue;
  71. }
  72. }
  73. #endregion
  74. private object findInnerMostTarget(object target)
  75. {
  76. foreach (var info in _chain)
  77. {
  78. target = info.GetValue(target);
  79. if (target == null)
  80. {
  81. return null;
  82. }
  83. }
  84. return target;
  85. }
  86. }
  87. }