using System.Linq.Expressions; using TelegramBotBase.Form; namespace TelegramBotBase.Experiments.ActionManager.Navigation { public static class StringNavigation_Extensions { public static void AddStringNavigation(this ExternalActionManager manager, string method, Expression> propertySelector) where TForm : FormBase { if (!typeof(FormBase).IsAssignableFrom(typeof(TForm))) { throw new ArgumentException($"{nameof(TForm)} argument must be a {nameof(FormBase)} type"); } var newValue = Expression.Parameter(propertySelector.Body.Type); var assign = Expression.Lambda>(Expression.Assign(propertySelector.Body, newValue), propertySelector.Parameters[0], newValue); var setter = assign.Compile(true); manager.Add(new StringNavigation(method, setter)); } public static void AddStringNavigation(this ExternalActionManager manager, string method, Action action) where TForm : FormBase { if (!typeof(FormBase).IsAssignableFrom(typeof(TForm))) { throw new ArgumentException($"{nameof(TForm)} argument must be a {nameof(FormBase)} type"); } manager.Add(new StringNavigation(method, action)); } public static void AddStringNavigation(this ExternalActionManager manager, Type formType, string value, Expression> propertySelector) { if (!typeof(FormBase).IsAssignableFrom(formType)) { throw new ArgumentException($"{nameof(formType)} argument must be a {nameof(FormBase)} type"); } var newValue = Expression.Parameter(propertySelector.Body.Type); var assign = Expression.Lambda>(Expression.Assign(propertySelector.Body, newValue), propertySelector.Parameters[0], newValue); var setter = assign.Compile(true); manager.Add(new StringNavigation(formType, value, setter)); } public static void AddStringNavigation(this ExternalActionManager manager, Type formType, string method, Action action) { if (!typeof(FormBase).IsAssignableFrom(formType)) { throw new ArgumentException($"{nameof(formType)} argument must be a {nameof(FormBase)} type"); } manager.Add(new StringNavigation(formType, method, action)); } } }