.NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд░рди рд╕рдордп рдкрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореГрджреНрдз рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рддрдВрддреНрд░ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЙрдирдХреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдирдХреЗ рдирд╛рдо рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ (рдирд╛рдо рдмрджрд▓рдиреЗ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдиреЗ) рдпрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рдЕрдкрд╡рд┐рддреНрд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рддрд░реНрдХ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдФрд░ C # рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╕рд┐рдВрдереЗрдЯреНрд░рд┐рдХ рд╢реБрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рджреВрд░ рдирд╣реАрдВ рдЬрд╛рдиреЗ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗред
public class SimpleClass { private readonly string theValue; public SimpleClass(string value, int ratio) { theValue = value; } public string Value { get { return theValue; } } }
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
internal static PropertyInfo ValueProperty { get { return typeof(SimpleClass).GetProperty("Value"); } } internal static FieldInfo ValueField { get { return typeof(SimpleClass).GetField("theValue", BindingFlags.NonPublic | BindingFlags.Instance); } } internal static ConstructorInfo Constructor { get { return typeof(SimpleClass).GetConstructor(new[] { typeof(string), typeof( }); } }
рдпрджрд┐ рд╣рдо рдЗрди рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рди рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдорд┐рд▓рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк IDE рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЗрдВрдЬрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Visual Studio рдореЗрдВ рдпрд╣ Refactoring рдореЗрдиреВ, Reorder рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдЗрдЯрдо) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рдПрдХ рдЦрд╛рд▓реА рд▓рд┐рдВрдХ (рдЕрд░реНрдерд╛рдд рд╢реВрдиреНрдп) рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧреАред рдФрд░ рдпрджрд┐ рдЖрдк рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рднреА рдУрдлрд╝реНрдлрд╝реИрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧреА (рдорд╛рдорд▓реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЬрдм
рдСрдмрдлрд╕реНрдХреЗрд╢рди рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝, рднреЗрдбрд╝ рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдмрд╛рдВрдзреЗ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдм рд╕реЗ рд╣рдо рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЧреЛрдВрдж рдХрд░рддреЗ рд╣реИрдВ:
static TMember Reflect<TDelegate, TMember>(Expression<TDelegate> memberAccess) where TDelegate : class where TMember : MemberInfo { if (memberAccess.Body is MemberExpression) return ((MemberExpression)memberAccess.Body).Member as TMember; else if (memberAccess.Body is NewExpression) return ((NewExpression)memberAccess.Body).Constructor as TMember; else if (memberAccess.Body is MethodCallExpression) return ((MethodCallExpression)memberAccess.Body).Method as TMember; else return null; }
рдпрд╣ рд╡рд┐рдзрд┐ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ: рдкрд╣рд▓реА рджрд▓реАрд▓ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд╕рджрд╕реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП FieldInfo) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреАрд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╢рд░реАрд░ рдХрдХреНрд╖рд╛ рдХреЗ рдХрд┐рд╕реА рд╕рджрд╕реНрдп рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд░реАрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ:
- рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ;
- рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ (рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ);
- рд╡рд┐рдзрд┐ рдХреЙрд▓ред
рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд▓рдВрдЧрд░ рдХреЗ рдЭрдВрдбреЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрддреНрд╡реЛрдВ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреНрд░рддрд┐рдмрд┐рдВрдмрди рддрд░реАрдХреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рддрд░реАрдХреЗ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░рд┐рдВрдЧ рдЗрдВрдЬрди рдФрд░ рдУрдлрд╝реНрдлрд╝рд╕реБрдХреЗрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред
рдЕрдм рд╕рдм рдХреБрдЫ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдЬреЛ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЕрдкрдиреЗ рдЖрдк рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрд╕рдлреЗрдХрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
internal static PropertyInfo ValueProperty { get { return Reflect<Func<SimpleClass, string>, PropertyInfo>(v => v.Value); } } internal static FieldInfo ValueField { get { return Reflect<Func<SimpleClass, string>, FieldInfo>(v => v.theValue); } } internal static ConstructorInfo Constructor { get { return Reflect<Func<string, int, SimpleClass>, ConstructorInfo>((a1, a2) => new SimpleClass(a1, a2)); } }
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпреЛрдВ рдЗрд╕ рдХреЛрдб рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреЗ рдмрд╛рдж рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ obfuscator? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП C # рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк ILDASM рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ LDTOKEN рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреАрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рджрд╕реНрдп рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рд╣рдореЗрд╢рд╛ BUT рд╣реЛрддрд╛ рд╣реИ
рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╕реНрдХреЛрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред