using System.Linq.Expressions; using TelegramBotBase.Form; namespace TelegramBotBase.Experiments.ActionManager.Navigation { public static class EndsWithNavigation_Extensions { public static void AddEndsWithNavigation(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 EndsWithNavigation(method, setter)); } public static void AddEndsWithNavigation(this ExternalActionManager manager, string value, Action setProperty) where TForm : FormBase { if (!typeof(FormBase).IsAssignableFrom(typeof(TForm))) { throw new ArgumentException($"{nameof(TForm)} argument must be a {nameof(FormBase)} type"); } manager.Add(new EndsWithNavigation(value, setProperty)); } public static void AddEndsWithNavigation(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 EndsWithNavigation(formType, value, setter)); } public static void AddEndsWithNavigation(this ExternalActionManager manager, Type formType, string value, Action setProperty) { if (!typeof(FormBase).IsAssignableFrom(formType)) { throw new ArgumentException($"{nameof(formType)} argument must be a {nameof(FormBase)} type"); } manager.Add(new EndsWithNavigation(formType, value, setProperty)); } } }