Resharper有一个警告叫做#34;调用多态字段事件"。鉴于这些解释,修复它似乎是一个好主意:
但是,在我的情况下,推荐的解决方案似乎不可行,因为在引发事件时,子类中的type参数是必需的。出于性能原因,我不想调用ValueToString,直到检查了ValueChanging(通常为null)。
在这种情况下推荐的解决方案是什么?我在下面有一些代码示例。 Foo的基类被分为泛型和非泛型,以便在更多情况下我可以利用多态性。
public class ValueChangingEventArgs : EventArgs
{
public Foo ChangingFoo { get; set; }
public string NewValueAsString { get; private set; }
public ValueChangingEventArgs(Foo changingFoo, string newValueAsString)
{
ChangingFoo = changingFoo;
NewValueAsString = newValueAsString;
}
}
public abstract class Foo
{
public abstract event EventHandler<ValueChangingEventArgs> ValueChanging;
private IEnumerable<Foo> _directlyRelated;
public IEnumerable<Foo> GetRelated()
{
var result = new HashSet<Foo>();
GetRelated(result);
return result;
}
private void GetRelated(HashSet<Foo> resultSoFar)
{
foreach (var dr in _directlyRelated)
{
if (resultSoFar.Add(dr))
{
dr.GetRelated(resultSoFar);
}
}
}
}
public abstract class Foo<TValue> : Foo
{
private TValue mValue;
public override event EventHandler<ValueChangingEventArgs> ValueChanging;
private void OnValueChanging(TValue newValue)
{
if (ValueChanging != null)
{
ValueChanging(this, new ValueChangingEventArgs(this, ValueToString(newValue)));
}
}
protected abstract string ValueToString(TValue value);
public void SetValue(TValue newValue)
{
if (!newValue.Equals(mValue))
{
OnValueChanging(newValue);
mValue = newValue;
}
}
}
public interface IBar
{
string PossiblyCrazyComputation();
}
public class BarFoo : Foo<IBar>
{
protected override string ValueToString(IBar value)
{
return value.PossiblyCrazyComputation();
}
}
public class BazFoo : Foo<IBaz>
答案 0 :(得分:0)
如果我密封事件覆盖,则结果是错误消失。现在我觉得有意义了;现在确保只有一个事件的实现。
public abstract class Foo<TValue> : Foo
{
private TValue mValue;
public sealed override event EventHandler<ValueChangingEventArgs> ValueChanging;