我们希望根据角色掩盖业务对象中的一些信息,发现我们的代码库是在业务逻辑而非UI中的多个项目之间共享的。
我们的想法是override
CSLA中的LoadProperty
方法,以便我们可以更改一次值,而不是将其设置为未屏蔽的值,然后在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);
答案 0 :(得分:0)
问题是永远不会触发虚拟LoadProperty方法
我假设您对LoadProperty的调用是特定于类型的(您的newValue
是作为实际类型传递的,而不是object
类型。
虚拟非泛型LoadProperty的类型特定于通用LoadProperty,因为参数类型为IPropertyInfo
和object
。此方法存在于直到运行时才能确定值的数据类型的情况。
因此,除非您将newValue
作为object
类型传递,否则将调用LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue)
。
但只有一个是虚拟的
由于您实际想要覆盖的方法不是虚拟的,因此您必须解决此问题。
我会创建自己的方法,使用不同的名称进行屏蔽,然后调用基本的LoadProperty方法。但如果你真的想要&#34;覆盖&#34; LoadProperty,您可以使用new
隐藏基本方法作为替代方法:
protected new void LoadProperty<P>(PropertyInfo<P> propertyInfo, P newValue)
{
//Do masking
newValue = DoMask(newValue, maskAttribute);
base.LoadProperty(propertyInfo, newValue);
}
请参阅此answer以查看隐藏而不是覆盖的含义,这可能会或可能不会成为您的问题。