簡體   English   中英

將枚舉元素作為事件args C#傳遞

[英]Pass enum elements as event args C#

是否可以將Enum元素作為事件參數傳遞?

假設我有..

public class Letters
{
    public delegate void StateChangedEventHandler(object sender, EventArgs e);
    public event StateChangedEventHandler StateChanged;

    public AbcState state = AbcState.Aaa;     
    public AbcState State
    {
        get{return this.state;}
        set
        {
            this.state = value;
            this.OnStateChanged();
        }
    }

    public enum AbcState
    {
        Aaa,
        Bbb,
        Ccc
    }

    protected virtual void OnStateChanged()
    {
        StateChanged?.Invoke(this, State);
    }

看到我如何嘗試將枚舉的元素作為事件參數傳遞嗎? 現在,我通常會創建一個類並擴展EventArgs,然后可以傳遞該類本身。 我知道我可以在這里做同樣的事情,創建一個擴展EventArgs的不同類,然后在該類中創建枚舉,字段和屬性。 然后將后者的實例放入我的類“ Letters”(在上面的代碼中使用)。

但是,那不瘋狂嗎? 一定有更好的方法。 請告訴我有一個簡單的方法。

順便說一下,我不知道上面的代碼是否可以編譯,因為我現在不在開發計算機中,所以我只是直接在編輯器中編寫了代碼。

如果您希望事件的參數為枚舉,那么可以肯定的是,在聲明事件時只需將其指定為簽名即可:

public class Letters
{
    public event Action<AbcState> StateChanged;

    private AbcState state = AbcState.Aaa;     
    public AbcState State
    {
        get{return this.state;}
        set
        {
            this.state = value;
            this.OnStateChanged();
        }
    }

    public enum AbcState
    {
        Aaa,
        Bbb,
        Ccc
    }

    protected virtual void OnStateChanged()
    {
        StateChanged?.Invoke(State);
    }
}

不,那不是那么瘋狂。 遵循約定並不是什么瘋狂的事情,即使它們有時看起來有些笨拙,因為那樣的話,那些維護您的代碼的人(包括您,在您忘記編寫這些東西之后就包括您)將發現盡可能少的驚喜。

您可以選擇使用EventHandler<T> ,但是:

public event EventHandler<AbcState> StateChanged;

protected void OnStateChanged(AbcState state)
{
    StateChanged?.Invoke(this, state);
}

順便說一句,您不必聲明新的冗余委托類型即可聲明事件。 這與您的原始聲明相同:

public event EventHandler StateChanged;

最好的事情是寫這樣的東西:

public class ValueEventArgs<T> : EventArgs
{
    public ValueEventArgs(T value)
    {
        Value = value;
    }

    public T Value { get; protected set; }
}

並像這樣使用它:

public event EventHandler<ValueEventArgs<AbcState>> StateChanged;

protected void OnStateChanged(AbcState state)
{
    StateChanged?.Invoke(this, new ValueEventArgs<AbcState>(state));
}

您還可以編寫具有舊值和新值屬性等的ValueChangedEventArgs<T> ,等等。但是EventHandler<AbcState>是執行所需操作的最快類型安全方式。

最后, 可以Action<T>用作event委托,但這不是一個好主意。 人們看到Action<T> ,但他們並不希望這是一個event 您唯一要添加的就是當有人嘗試讀取您的代碼時感到困惑。 除非有一些明確的明顯優勢(這里沒有),否則不要編寫乍一看似乎不是的代碼。

沒有什么可以阻止您不遵循事件處理程序約定:

public enum Test { X }

public class A
{
    public event Action<Test> StuffDone;    
}

您將可以執行以下操作:

A a = new A();
a.StuffDone += test =>
{
    if(test == Test.X)
    {

    }
};

這只是一個約定,不是語言限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM