using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Dynamic; namespace ClassLibrary2 { public class Calculator { public int Sum(int val1, int val2) { return val1 + val2; } } public class DynamicDataContext : DynamicObject { internal Dictionary<dynamic, dynamic> _bags = new Dictionary<dynamic, dynamic>(); public override bool TryGetMember(GetMemberBinder binder, out object result) { if (_bags.Keys.Contains(binder.Name)) result = _bags[binder.Name]; else { TableObject<dynamic> table = new TableObject<dynamic>(); table._context = this; _bags.Add(binder.Name, table); result = _bags[binder.Name]; } return true; } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { result = null; if (binder.Name.Equals("SubmitChanges")) return true; return false; } } public class PropertyCollectionObject : DynamicObject { private Dictionary<dynamic, dynamic> _bags = new Dictionary<dynamic, dynamic>(); public override bool TryGetMember(GetMemberBinder binder, out object result) { if (_bags.Keys.Contains(binder.Name)) result = _bags[binder.Name]; else result = null; return result != null; } public override bool TrySetMember(SetMemberBinder binder, object value) { if (_bags.Keys.Contains(binder.Name)) _bags[binder.Name] = value; else _bags.Add(binder.Name, value); return true; } } public class TableObject<T> : DynamicObject, IList<T> { internal DynamicDataContext _context = null; private List<T> items = new List<T>(); public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { result = null; if (binder.Name.Equals("InsertOnSubmit")) items.Add((T)args[0]); else if (binder.Name.Equals("DeleteOnSubmit")) items.Remove((T)args[0]); return true; } public int IndexOf(T item) { return items.IndexOf(item); } public void Insert(int index, T item) { items.Insert(index, item); } public void RemoveAt(int index) { items.RemoveAt(index); } public T this[int index] { get { return items[index]; } set { items[index] = value; } } public void Add(T item) { items.Add(item); } public void Clear() { items.Clear(); } public bool Contains(T item) { return items.Contains(item); } public void CopyTo(T[] array, int arrayIndex) { items.CopyTo(array, arrayIndex); } public int Count { get { return items.Count; } } public bool IsReadOnly { get { return false; } } public bool Remove(T item) { return items.Remove(item); } public IEnumerator<T> GetEnumerator() { return items.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return items.GetEnumerator(); } } public class NorthwindDataContext : DynamicDataContext { } public class Customer : PropertyCollectionObject { } } |