using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; namespace ConsoleApplication1 { internal class Program { private static void Main() { var student = new Student { Age = 15 }; var p = new Parent { Role = "", Sex = "Male" }; student.TheParent = p; student.Validate(s => s.Age, s => s.Name); student.Validate(); Console.Read(); } } public class Parent { public string Role { get; set; } public string Sex { get; set; } } public class Student { public Student() { BuildValidationMethods(); } public int Age { get; set; } public string Name { get; set; } public Parent TheParent { get; set; } public void Validate(params Expression<Func<Student, object>>[] expression) { foreach (var expr in expression) { string proName = string.Empty; var unaryExpresson = expr.Body as UnaryExpression; if (unaryExpresson != null) { proName = (unaryExpresson.Operand as MemberExpression).Member.Name; } else { proName = ((MemberExpression)expr.Body).Member.Name; } Validate(proName); } } private readonly IDictionary<object, Action> _validateMethods = new Dictionary<object, Action>(); public void Validate(string proName) { _validateMethods[proName](); } private string ExpressionToString<TProperty>(Expression<Func<Student, TProperty>> expression) { return ((MemberExpression)expression.Body).Member.Name; } public void BuildValidationMethods() { _validateMethods.Add(ExpressionToString(s=>s.Age), () => Console.WriteLine(Age < 18 ? "teen-agers" : "adult")); _validateMethods.Add(ExpressionToString(s=>Name), () => { if (String.IsNullOrEmpty(Name)) Console.WriteLine("Name is empty"); }); _validateMethods.Add(ExpressionToString(s=>s.TheParent.Role), () => { if (string.IsNullOrEmpty(TheParent.Role)) { Console.WriteLine("Role is empty"); } }); } public void Validate() { foreach (var validateMethod in _validateMethods.Values) { validateMethod(); } } } }