Feedback

C# - PrivateAccess

Veröffentlicht von am 04.11.2015
(0 Bewertungen)
Wrapper für den Zugriff auf private Felder und Methoden über dynamic.

Sinnvoll für UnitTests

Beispiel:


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();
}

GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

    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;
        }
    }
Abgelegt unter privateaccess, reflection, dynamic.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!