diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2016-11-19 11:16:01 +0100 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2016-11-19 11:16:01 +0100 |
| commit | 4fb8b3a075bd8232be6fdcbb1f5a3b45265d33b4 (patch) | |
| tree | 766be5b33f22c7c9097c0ca5545fe8c24a58c78a /src/IML/MemberAddress.cs | |
| parent | adbb4fd07a7c7ed236553d928be25c41c7106c27 (diff) | |
basic datasource binding functional without inititial set value during dschanged
Diffstat (limited to 'src/IML/MemberAddress.cs')
| -rw-r--r-- | src/IML/MemberAddress.cs | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/src/IML/MemberAddress.cs b/src/IML/MemberAddress.cs index 85a346e4..89a293c3 100644 --- a/src/IML/MemberAddress.cs +++ b/src/IML/MemberAddress.cs @@ -19,20 +19,44 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. using System; +using System.Linq; +using System.Reflection; + namespace Crow.IML { /// <summary> /// Address member of a node /// </summary> public struct MemberAddress - { + { + string memberName; + MemberInfo member; public NodeAddress Address; - public string Name; - public MemberAddress (NodeAddress _address, string _member) +// public string Name { +// get { return memberName; } +// set { memberName = value; } +// } + + public MemberAddress (NodeAddress _address, string _member, bool findMember = true) + { + Address = _address; + memberName = _member; + member = null; + + if (!findMember) + return; + if (!tryFindMember ()) + throw new Exception ("Member Not Found: " + memberName); + } + public MemberAddress (NodeAddress _address, MemberInfo _member) { Address = _address; - Name = _member; + member = _member; + memberName = ""; + + if (member != null) + memberName = member.Name; } #region Equality Compare @@ -42,16 +66,36 @@ namespace Crow.IML } public override int GetHashCode () { - return Address.GetHashCode () ^ Name.GetHashCode (); + return Address.GetHashCode () ^ member.GetHashCode (); } public static bool operator == (MemberAddress x, MemberAddress y) { - return x.Address == y.Address && x.Name == y.Name; + return x.Address == y.Address && x.memberName == y.memberName; } public static bool operator != (MemberAddress x, MemberAddress y) { return !(x == y); } #endregion + + bool tryFindMember () + { + if (member != null) + throw new Exception ("member already found"); + if (Address == null) + return false; + Type t = Address.LastOrDefault ().CrowType; + member = t.GetMember (memberName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).FirstOrDefault (); + + #region search for extensions methods if member not found in type + if (member == null && !string.IsNullOrEmpty (memberName)) { + Assembly a = Assembly.GetExecutingAssembly (); + string mn = memberName; + member = CompilerServices.GetExtensionMethods (a, t).Where (em => em.Name == mn).FirstOrDefault (); + } + #endregion + + return member != null; + } } } |