public class Example { private int JustInt; // Some code here public void DoSomething(Example example) { this.JustInt = example.JustInt; // , } }
public class SecretKeeper { private int _secret; // // public int Secret{get { return _secret; } set { _secret = value; }} }
protected int SecretForInheritors => _secret; // _secret
public class SecretKeeperInheritor : SecretKeeper { public int GetSecret() { return SecretForInheritors; } }
var secret = new SecretKeeperInheritor {Secret = 42}.GetSecret(); Console.WriteLine ( secret == 42 ? "Inheritors test: passed" : "Inheritors test: failed" );
public class SecretKeeper { private int _secret; // public int Secret{get { return _secret; } set { _secret = value; }} }
public static class SecretFinder { public static int GetSecretUsingFieldInfo(this SecretKeeper keeper) { FieldInfo fieldInfo = typeof (SecretKeeper).GetField("_secret", BindingFlags.Instance | BindingFlags.NonPublic); int result = (int)fieldInfo.GetValue(keeper); return result; } }
SecretKeeper keeper = new SecretKeeper {Secret = 42}; // int fieldInfoSecret = keeper.GetSecretUsingFieldInfo(); // Console.WriteLine ( fieldInfoSecret == 42 ? "FieldInfo test: passed" : "FieldInfo test: failed" // );
public class SecretKeeper { private int _secret; // public int Secret{get { return _secret; } set { _secret = value; }} }
public static int GetSecretUsingExpressionTrees(this SecretKeeper keeper) { ParameterExpression keeperArg = Expression.Parameter(typeof(SecretKeeper), "keeper"); // SecretKeeper keeper argument Expression secretAccessor = Expression.Field(keeperArg, "_secret"); // keeper._secret var lambda = Expression.Lambda<Func<SecretKeeper, int>>(secretAccessor, keeperArg); var func = lambda.Compile(); // return result = keeper._secret; return func(keeper); }
SecretKeeper keeper = new SecretKeeper {Secret = 42}; // int fieldInfoSecret = keeper.GetSecretUsingExpressionTrees(); // Console.WriteLine ( fieldInfoSecret == 42 ? "ExpressionTrees test: passed" : "ExpressionTrees test: failed" // );
[StructLayout(LayoutKind.Explicit, Pack = 1)] public struct StructWithSecret { [FieldOffset(0)] private int _secret; public StructWithSecret(int secret) { _secret = secret; } }
[StructLayout(LayoutKind.Explicit, Pack = 1)] public struct Mirror { [FieldOffset(0)] public int Secret; }
[StructLayout(LayoutKind.Explicit, Pack = 1)] public struct Holmes { [FieldOffset(0)] public StructWithSecret HereIsSecret; // [FieldOffset(0)] public Mirror LetsLookAtTheMirror; // }
public static int GetSecretFromStruct(this StructWithSecret structWithSecret) { Holmes holmes = new Holmes {HereIsSecret = structWithSecret}; // return holmes.LetsLookAtTheMirror.Secret; // ( ) }
var alreadyNotSecret = new StructWithSecret(42).GetSecretFromStruct(); Console.WriteLine ( alreadyNotSecret == 42 ? "Structs test: passed" : "Structs test: failed" );
Source: https://habr.com/ru/post/304520/
All Articles