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]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

    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!