如何修复"调用多态字段事件"什么时候实施取决于儿童班?

时间:2016-05-02 16:13:26

标签: c# resharper

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>

1 个答案:

答案 0 :(得分:0)

如果我密封事件覆盖,则结果是错误消失。现在我觉得有意义了;现在确保只有一个事件的实现。

public abstract class Foo<TValue> : Foo
{
    private TValue mValue;

    public sealed override event EventHandler<ValueChangingEventArgs> ValueChanging;