рдЧрддрд┐рд╢реАрд▓ рдкрд╣рд▓реВ рдЙрдиреНрдореБрдЦ

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╖рдп рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╣рд╛рдиреА, рдЬрд╣рд╛рдВ рдХрдИ рдорд╛рдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореВрд▓реНрдп рджреВрд╕рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп


рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреБрджрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕реЗрдВрд╕рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реАрдорд╛ рд╕реЗрдВрд╕рд░, рдореЙрдбрд▓ рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдФрд░ рд╕рдВрднрд╡ рдореЙрдбрд▓ рд╕реЗрдВрд╕рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ред

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рд╕реЗрдВрд╕рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрд╕рдХреЗ рдореВрд▓реНрдп (рдЬрд┐рд╕ рд╕реАрдорд╛ рдкрд░ рдЗрд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЛ рд▓реЗрддреЗ рд╣реИрдВред

public class Sensor { // Voltage, Temperature public SensorType Type { get; internal set; } //-400..400 for Voltage, 200..600 for Temperature public decimal Value { get; internal set; } } 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЛрд▓реНрдЯреЗрдЬ рдФрд░ рддрд╛рдкрдорд╛рди рд╕реЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреНрд░рдорд╢рдГ рд░реЗрдВрдЬ -400..400 рдФрд░ 200..600 рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдФрд░ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

"рд╕рд░рд▓" рд╕рдорд╛рдзрд╛рди


рдбреЗрдЯрд╛ рд╕рдВрдЧрддрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯрд░реНрд╕ рдФрд░ рдЧреЗрдЯрд░реНрд╕ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ:

 public class Sensor { private SensorType _type; private decimal _value; public SensorType Type { get { return _type; } set { _type = value; if (value == SensorType.Temperature) Value = 273; if (value == SensorType.Voltage) Value = 0; } } public decimal Value { get { return _value; } set { if (Type == SensorType.Temperature && value >= 200 && value <= 600 || Type == SensorType.Voltage && value >= -400 && value <= 400) _value = value; } } } 

рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдмрджрд▓рдирд╛ рдпрд╛ рдирдИ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдЫрд╡рд┐

рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 30 рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП 200 рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдпрдо рд╣реИрдВред рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд╛рдо рдХрд░рдирд╛, рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕рдорд░реНрдерди рдореЗрдВ рднрд╛рд░реА рд╕рд┐рд░рджрд░реНрдж рд▓рд╛рдПрдЧрд╛ред

"рдЖрджрд░реНрд╢" рд▓реЗрдХрд┐рди рдЕрд╕рддреНрдп


рдирд┐рдпрдореЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирд╕реЗ рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ:

 public class Sensor { public SensorType Type { get; set; } [Number(Type = SensorType.Temperature, Min = 200, Max = 600, Force = 273)] [Number(Type = SensorType.Voltage, Min = -400, Max = 400, Force = 0)] public decimal Value { get; set; } } 

рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреА рд╣реИ рддреЛ рдмрд▓ рдХреЛ рдХрд┐рд╕ рдореВрд▓реНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред

рдХреЗрд╡рд▓ C # рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрди рдлрд╝реАрд▓реНрдб рдХреА рд╕реВрдЪреА, рдЬрд┐рди рдкрд░ рд▓рдХреНрд╖реНрдп рдЧреБрдг рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИред

рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛


рд╣рдо рдирд┐рдпрдореЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ:

 public class Sensor { public SensorType Type { get; set; } [Number("Type=Temperature", "200..600", Force = "273")] [Number("Type=Voltage", "-400..400", Force = "0")] public decimal Value { get; set; } } 

рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕реА рдХреНрд▓рд╛рд╕ рдмрд╕ рдмреЗрдХрд╛рд░ рд╣реИред

рдбрд┐рд╕реНрдкреИрдЪрд░


рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИ - рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝реАрд▓реНрдб рдорд╛рди рдмрджрд▓реЗрдВ, рдЬреЛ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдордЭреЗрдВрдЧреЗ, рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВрдЧреЗ, рдлрд╝реАрд▓реНрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВрдЧреЗред

рдЫрд╡рд┐

рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рднрдпрд╛рдирдХ рд▓рдЧреЗрдЧрд╛:

 someDispatcher.Set(mySensor, "Type", SensorType.Voltage); 

рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 mySensor.Set("Type", SensorType.Voltage) 

рд▓реЗрдХрд┐рди рдореЗрд░реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдЗрддрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВ рдмрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

 mySensor.Type=SensorType.Voltage; 

рд╡рд┐рд░рд╛рд╕рдд


рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ, рд╣рдо рдЦреБрдж рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдореЗрдВ рд╣реА рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдЙрдирдХрд╛ рд╕рдВрдкрд╛рджрди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЖрднрд╛рд╕реА рдмрдирд╛ рджреЗрдВрдЧреЗ, рд╣рдо рдореЙрдбрд▓ рдХреЗ рдмрд╛рд╣рд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд░реИрдкрд░" рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдЪреЗрдХ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред

рдЫрд╡рд┐

рдпрд╣ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛

 mySensor.Type=SensorType.Voltage 

рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рд░реИрдкрд░ рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рдПрдВ

рдХрдХреНрд╖рд╛ рд╕реГрдЬрди


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:

  • рдкреВрд░реА рд╡рд┐рд╢реЗрд╖рддрд╛-рдЖрдзрд╛рд░рд┐рдд рдХреЛрдб рдмрдирд╛рдПрдБ
  • рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд╛рдБрдЪ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреВрд░рд╛ рдХреЛрдб рдмрдирд╛рдПрдБ

рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдмрдирд╛рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рддрд╛рдХрдд рдЪрд╛рд╣рд┐рдП рд╣реЛрдЧреАред рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЕрдЧрд░ рдЖрдкрдХреЛ рдирдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ / рдирд┐рдпрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХрд┐рддрдиреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдХреМрди рд╕реА рдЬрдЯрд┐рд▓рддрд╛?

рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рдЧреЗрдЯрдЯрд░ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ:

 MethodBuilder getPropMthdBldr = typeBuilder.DefineMethod("get_" + property.Name, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual, property.PropertyType, Type.EmptyTypes); ILGenerator getIl = getPropMthdBldr.GetILGenerator(); getIl.Emit(OpCodes.Ldarg_0); getIl.Emit(OpCodes.Call, property.GetMethod); getIl.Emit(OpCodes.Ret); 

рдпрд╣рд╛рдВ, рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдореЗрдВ рдЖрдпрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ (рдпрд╣) рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред рдлрд┐рд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдЧреЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЬрд▓реНрдЯ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдЯреИрдХ рдХреЗ рдКрдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдмрд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЧреЗрдЯреНрдЯрд░ред

рд╕реЗрдЯрд░ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдПрдЧреА:

 if (StrongValidate(this, property, value)) { value = SoftValidate(this, property, value); if (oldValue != value) { <    value>; ForceValidate(baseModel, property); Log(baseModel, property, value, oldValue); } } 

StrongValidate - рдЙрди рдорд╛рдиреЛрдВ рдХреЛ рддреНрдпрд╛рдЧ рджреЗрдЧрд╛ рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рдЬреЛ рдирд┐рдпрдореЛрдВ рдХреЛ рдлрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ "y" рдФрд░ "n" рдХреЛ рдкрд╛рда рдмреЙрдХреНрд╕ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ; рдЬрдм рдЖрдк "u" рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдореЙрдбрд▓ рдирд╖реНрдЯ рди рд╣реЛред

  [String("", "y, n")] 

рд╕реЙрдлреНрдЯрд╡реИрд▓рд┐рдбреЗрдЯ - рдЕрдиреБрдЪрд┐рдд рд╕реЗ рдорд╛рдиреНрдп рдХреЛ рдорд╛рдиреНрдп рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдВрдЯ рдлреАрд▓реНрдб рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЖрдк 111 рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореВрд▓реНрдп рдХреЛ рдирд┐рдХрдЯрддрдо рдЙрдкрдпреБрдХреНрдд рдПрдХ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ - "9"ред

  [Number("", "0..9")] 

<рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рд╕реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ> - рдЬрдм рд╣рдо рдПрдХ рд╡реИрдз рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

ForceValidate - рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрджрд▓рддреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдорд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред

рд▓реЙрдЧ рд╕рд┐рд░реНрдл рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рд╣реИред

рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдирдП рдФрд░ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп, рдФрд░ рдХреНрд╖реЗрддреНрд░ рдЬреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 MethodBuilder setPropMthdBldr = typeBuilder.DefineMethod("set_" + property.Name, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual, null, new[] { property.PropertyType }); //  ,    var setter = typeof(DinamicWrapper).GetMethod("Setter", BindingFlags.Static | BindingFlags.Public); ILGenerator setIl = setPropMthdBldr.GetILGenerator(); setIl.Emit(OpCodes.Ldarg_0);//     - this setIl.Emit(OpCodes.Ldarg_1);//     -  setter    (value) if (property.PropertyType.IsValueType) //  Boxing,    Value,         object { setIl.Emit(OpCodes.Box, property.PropertyType); } setIl.Emit(OpCodes.Ldstr, property.Name); //     setIl.Emit(OpCodes.Call, setter); setIl.Emit(OpCodes.Ret); 

рд╣рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рд╕реАрдзреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓ рджреЗрдЧреАред рдХреЛрдб рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреЗрдЯреНрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ - рдпрд╣ рдФрд░ рдорд╛рди:

 MethodBuilder setPureMthdBldr = typeBuilder.DefineMethod("set_Pure_" + property.Name, MethodAttributes.Public, CallingConventions.Standard, null, new[] { property.PropertyType }); ILGenerator setPureIl = setPureMthdBldr.GetILGenerator(); setPureIl.Emit(OpCodes.Ldarg_0); setPureIl.Emit(OpCodes.Ldarg_1); setPureIl.Emit(OpCodes.Call, property.GetSetMethod()); setPureIl.Emit(OpCodes.Ret); 

рдЫреЛрдЯреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
github.com/wolf-off/DinamicAspect

рд╕рддреНрдпрд╛рдкрди


рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рдХреЛрдб рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рд╣реИрдВ - рд╡реЗ рд╕рдмрд╕реЗ рд▓рдВрдмреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд░реНрддрдорд╛рди рд╕рдХреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдирдпрд╛ рдореВрд▓реНрдп рд╡реИрдз рд╣реИред рдЖрдкрдХреЛ рдирд┐рдпрдореЛрдВ рдХреЛ рдЪреБрдирддреЗ рд╕рдордп рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдФрд░ рдЙрдкрдпреБрдХреНрдд рд▓реЛрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛):

  • GetCustomAttributes рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреИрд╢ рдХрд░реЗрдВред рдЦреЗрддреЛрдВ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд╛рд░реНрдп рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдмреЗрд╕рдореЙрдбрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
  • рдЙрдкрдпреБрдХреНрдд рдирд┐рдпрдореЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╕рднреА рдорд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдирдоред DependencyAttribute рдЖрдзрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдХреНрдпрд╛ рдлрд╛рдпрджрд╛ рд╣реИ?

рдФрд░ рд╡рд╣ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж:

 var target = DinamicWrapper.Create<Sensor>(); 

рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛:

 target.Type = SensorType.Temperature; target.Value=300; Assert.AreEqual(target.Value, 300); // true target.Value=3; Assert.AreEqual(target.Value, 200); // true - minimum target.Value=3000; Assert.AreEqual(target.Value, 600); // true - maximum target.Type = SensorType.Voltage; Assert.AreEqual(target.Value, 0); // true - minimum target.Value= 3000; Assert.AreEqual(target.Value, 400); // true - maximum 

Source: https://habr.com/ru/post/hi472598/


All Articles