Feedback

PrivateAccess

Sprache: C#

Wrapper für den Zugriff auf private Felder und Methoden über dynamic. Sinnvoll für UnitTests Beispiel: [code] public class TestClass { private int _field1 = 0; private int GetField() { return _field1; } private void IncField() { _field1++; } } static void Main(string[] args) { var test = new TestClass(); dynamic priv = new PrivateAccess(test); int i = priv.GetField(); Console.WriteLine(i); priv.IncField(); priv._field1++; i = priv._field1; Console.WriteLine(i); Console.ReadLine(); } [/code]
    public class PrivateAccess : DynamicObject
    {
        private readonly object _nested = null;
        public PrivateAccess(object obj)
        {
            _nested = obj;
        }

        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            result = null;

            var methods = _nested.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);
            var method = methods.FirstOrDefault(m => m.Name == binder.Name && m.GetParameters().Count() == binder.CallInfo.ArgumentCount);
            if (method == null)
            {
                return false;
            }

            result = method.Invoke(_nested, args);
            return true;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;

            var field = _nested.GetType().GetField(binder.Name, BindingFlags.Instance | BindingFlags.NonPublic);
            if (field == null)
            {
                return false;
            }

            result = field.GetValue(_nested);
            return true;
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            var field = _nested.GetType().GetField(binder.Name, BindingFlags.Instance | BindingFlags.NonPublic);
            if (field == null)
            {
                return false;
            }

            field.SetValue(_nested, value);
            return true;
        }
    }
    public class PrivateAccess : DynamicObject
    {
        private readonly object _nested = null;
        public PrivateAccess(object obj)
        {
            _nested = obj;
        }

        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            result = null;

            var methods = _nested.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic);
            var method = methods.FirstOrDefault(m => m.Name == binder.Name && m.GetParameters().Count() == binder.CallInfo.ArgumentCount);
            if (method == null)
            {
                return false;
            }

            result = method.Invoke(_nested, args);
            return true;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;

            var field = _nested.GetType().GetField(binder.Name, BindingFlags.Instance | BindingFlags.NonPublic);
            if (field == null)
            {
                return false;
            }

            result = field.GetValue(_nested);
            return true;
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            var field = _nested.GetType().GetField(binder.Name, BindingFlags.Instance | BindingFlags.NonPublic);
            if (field == null)
            {
                return false;
            }

            field.SetValue(_nested, value);
            return true;
        }
    }