Общий класс как свойство в неуниверсальном классе - PullRequest
0 голосов
/ 13 июня 2019

У меня есть собственный GridView, и я хочу установить некоторые правила для отображения ошибки. Я хотел бы сделать что-то подобное:

var grid = new MyGridView();
grid.DataSource = new List<MyClass>();
grid.InitErrorRegistrator<MyClass>()
   .RegisterRule(column1, x => x.Property1 == 12)
   .RegisterRule(column2, x => x.Property2 == "Test");

Так что, когда я заполняю сетку, я ожидаю увидеть ошибку, когда я заполняю значения строки недопустимыми значениями.

У меня есть что-то вроде этого:


internal class ErrorRegistrator
{
   internal GenericErrorRegistrator<T> Init<T>()
   {
      return new GenericErrorRegistrator<T>();
   }

   /*Here I think I could use methods to get values from GenericErrorRegistrator<T> dictionary like:*/
   internal bool CheckRule(string column, object row)
   {
      return GenericErrorRegistrator.CheckRule(column, row);
   }
}

public class GenericErrorRegistrator<T>
{
   private readonly Dictionary<string, object> _errorRules = new Dictionary<string, object>();
   internal Dictionary<string, object> ErrorRules => _errorRules;

   public void RegisterErrorRule(string columnName, Func<T, bool> func)
   {
      _errorRules.Add(columnName, func);
   }
   public bool CheckRule(string column, object row)
   {
       Func<T, bool> func = _errorRules[column]
       return func((T) row);  
   }
}

MyGridView

public class MyGridView : GridView
{
    internal ErrorRegistrator ErrorRegistrator = new ErrorRegistrator();

/*Here I think should be something like*/
    public GenericErrorRegistrator<T> InitErrorRegistrator<T>()
    {
        return ErrorRegistrator.Init<T>();
    }

}

В конце у меня есть класс GridController, который анализирует наличие каких-либо правил и применяет его к строке:

public class MyGridCurrencyDataController : CurrencyDataController
{
   public override ErrorInfo GetErrorInfo(int controllerRow, int column)
   {
      var info = base.GetErrorInfo(controllerRow, column);
      DataColumnInfo dataColumnInfo = Columns[column];
      BandedGridColumn gridColumn = GridColumns.ColumnByFieldName(dataColumnInfo.Name);

      if (HasErrRules ?? false)
      {
        object row = _view.GetRow(controllerRow);
        /*I think here I need something like this*/
        bool showError = _view.ErrorRegistrator.CheckRule(gridColumn.Name, row );                       
        if (showError)
           SetError(new RowColumnErrorEventArgs(info, controllerRow, gridColumn));
        else
           ClearError(new RowColumnErrorEventArgs(info, controllerRow, gridColumn));
       }
       _view.FillRowColumnError(controllerRow, gridColumn, info);
       return info;
     }
}

Как мне этого достичь и возможно ли это вообще?

1 Ответ

0 голосов
/ 14 июня 2019

Вот что у меня есть. Я проверю производительность позже, но, по крайней мере, это работает.

myGridView.InitRegistrator<Job>()
   .RegisterRule(column1, x => string.IsNullOrEmpty(x.Code))
   .RegisterRule(column2, x => string.IsNullOrEmpty(x.Name))

MyGridView

public class MyGridView : GridView
{
   internal ErrorRegistrator ErrorRegistrator = new ErrorRegistrator();
   public GenericErrorRegistrator<T> InitRegistrator<T>(params Func<T, bool>[] funcs)
   {
      return ErrorRegistrator.Init<T>();
   }
}

ErrorRegistrator

    internal class ErrorRegistrator
    {
        internal bool HasRules => _registrator.HasRules();

        private BaseGenericErrorRegistrator _registrator;
        internal GenericErrorRegistrator<T> Init<T>()
        {
            var errorRegistrator = new GenericErrorRegistrator<T>();
            _registrator = errorRegistrator;
            return errorRegistrator;
        }

        public bool CheckRule(string columnName, object row)
        {
            return _registrator.CheckRule(columnName, row);
        }
    }

    public abstract class BaseGenericErrorRegistrator
    {
        internal abstract bool HasRules();
        internal abstract bool CheckRule(string columnName, object row);
    }

    public class GenericErrorRegistrator<T> : BaseGenericErrorRegistrator
    {
        private readonly Dictionary<string, Func<T, bool>> _rules = new Dictionary<string, Func<T, bool>>();
        public GenericErrorRegistrator<T> RegisterRule(string columnName, Func<T, bool> func)
        {
            _rules.Add(columnName, func);
            return this;
        }

        internal override bool HasRules()
        {
            return _rules.Any();
        }

        internal override bool CheckRule(string columnName, object row)
        {
            return _rules.TryGetValue(columnName, out Func<T, bool> func) && func((T) row);
        }
    }

Тогда я могу использовать ErrorRegistrator поле для проверки правил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...