CSLA.NET переопределяет LoadProperty - PullRequest
0 голосов
/ 25 апреля 2018

Мы хотели бы замаскировать некоторую информацию в наших бизнес-объектах на основе ролей, видя, что наша кодовая база совместно используется несколькими проектами, и мы хотели бы сделать это в бизнес-логике, а не в пользовательском интерфейсе.

Наша идея заключалась в том, чтобы override метод LoadProperty в CSLA, чтобы мы могли изменить значение один раз, вместо того, чтобы устанавливать его на немаскированное значение, а затем маскировать после DataPortal_Fetch. Проблема в том, что виртуальный метод LoadProperty никогда не запускается, см. Код ниже:

    protected override void LoadProperty(IPropertyInfo propertyInfo, object newValue)
    {
        //Do masking
        newValue = DoMask(newValue, maskAttribute);
        base.LoadProperty(propertyInfo, newValue);
    }

Ниже приведены два метода в BusinessBase, но только один из них virtual:

protected void LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue);
protected virtual void LoadProperty(IPropertyInfo propertyInfo, object newValue);

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема в том, что виртуальный метод LoadProperty никогда не запускается

Я предполагаю, что ваши вызовы LoadProperty относятся к конкретному типу (ваш newValue передается как фактический тип, а не как object тип).

Виртуальный неуниверсальный LoadProperty менее специфичен для типа, чем универсальный LoadProperty, потому что типы параметров IPropertyInfo и object. Этот метод существует в тех случаях, когда тип данных значения не может быть определен до времени выполнения.

Поэтому, если вы не передаете newValue как тип object, вместо него будет вызван LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue).

но только один является виртуальным

Поскольку метод, который вы на самом деле хотите переопределить, не является виртуальным, вам придется обойти это.

Я бы создал свой собственный метод с другим именем, который выполняет маскирование, а затем вызвал бы базовый метод LoadProperty. Но если вы действительно хотите «переопределить» LoadProperty, вы можете использовать new, чтобы скрыть базовый метод в качестве альтернативы:

protected new void LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue)
{
    //Do masking
    newValue = DoMask(newValue, maskAttribute);
    base.LoadProperty(propertyInfo, newValue);
}

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

...