aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/IML/MemberAddress.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/IML/MemberAddress.cs')
-rw-r--r--src/IML/MemberAddress.cs56
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;
+ }
}
}