【问题标题】:Generic class as property in a nongeneric class泛型类作为非泛型类中的属性
【发布时间】:2019-06-13 06:51:51
【问题描述】:

我有一个自定义的 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;
     }
}

我怎样才能做到这一点,这可能吗?

【问题讨论】:

    标签: c# .net winforms generics gridview


    【解决方案1】:

    这就是我所拥有的。我稍后会测试性能,但至少它可以工作。

    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>();
       }
    }
    

    错误注册器

        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字段检查规则

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多