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]

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

    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!