簡體   English   中英

.NET 是否有內置的 EventArgs<T> ?

[英]Does .NET have a built-in EventArgs<T>?

我准備為帶有單個參數的事件 args 創建一個通用的 EventArgs 類:

public class EventArg<T> : EventArgs
{
    // Property variable
    private readonly T p_EventData;

    // Constructor
    public EventArg(T data)
    {
        p_EventData = data;
    }

    // Property for EventArgs argument
    public T Data
    {
        get { return p_EventData; }
    }
}

在我這樣做之前,C# 是否具有內置到該語言中的相同功能? 我似乎記得在 C# 2.0 出現時遇到過類似的事情,但現在我找不到了。

或者換句話說,我必須創建自己的通用 EventArgs 類,還是 C# 提供一個? 謝謝你的幫助。

不。您可能正在考慮EventHandler<T> ,它允許您為任何特定類型的 EventArgs 定義委托。

不過,我個人認為EventArgs<T>不太合適。 在我看來,在事件 args 中用作“有效負載”的信息應該是一個自定義類,以使其用法和預期屬性非常清楚。 使用泛型類將阻止您將有意義的名稱放在適當的位置。 (“數據”代表什么?)

我必須說我不理解這里所有的“純粹主義者”。 即如果你已經定義了一個包類——它具有所有的細節、屬性等——為什么黑客創建一個額外的不必要的類只是為了能夠遵循事件/參數機制,簽名風格? 事情是 - 並非 .NET 中的所有內容 - 或者就此“缺失” - 是“好” - MS 多年來一直在“糾正”自己......我想說只是去創建一個 - 就像我做的那樣- 因為我就像那樣需要它 - 並為我節省了很多時間,

它確實存在。 至少,現在是這樣。

您可以在一些不同的 Microsoft 程序集/命名空間中找到DataEventArgs<TData> ,例如Microsoft.Practices.Prism.Events 然而,這些命名空間可能不適合包含在您的項目中,因此您可能只使用自己的實現。

如果您選擇不使用Prism ,但仍想嘗試通用EventArgs方法。

public class GenericEventArgs<T> : EventArgs
{
    public T EventData { get; private set; }

    public GenericEventArgs(T EventData)
    {
        this.EventData = EventData;
    }
}

// 使用以下示例代碼聲明ObjAdded事件

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;

// 使用以下示例代碼引發ObjAdded事件

private void OnObjAdded(TargetObjType TargetObj)
{
    if (ObjAdded!= null)
    {
        ObjAdded.Invoke(this, new GenericEventArgs<TargetObjType>(TargetObj));
    }
}

// 最后你可以訂閱你的ObjAdded事件

SubscriberObj.ObjAdded +=  (object sender, GenericEventArgs<TargetObjType> e) =>
{
    // Here you can explore your e.EventData properties
};

沒有內置的通用 ARGS。 如果您遵循 Microsoft EventHandler 模式,那么您可以按照您的建議實現派生的 EventArgs: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }

但是 - 如果您的團隊風格指南接受簡化 - 您的項目可以使用輕量級事件,如下所示:

public event Action<object, string> MyStringChanged;

用法 :

// How to rise
private void OnMyStringChanged(string e)
{
    Action<object, string> handler = MyStringChanged;    // thread safeness
    if (handler != null)
    {
        handler(this, e);
    }
}

// How to handle
myObject.MyStringChanged += (sender, e) => Console.WriteLine(e);

通常 PoC 項目使用后一種方法。 但是,在專業應用程序中,請注意 FX 警察的理由 #CA1009: https ://msdn.microsoft.com/en-us/library/ms182133.aspx

泛型類型的問題在於,即使 DerivedType 繼承自 BaseType,EventArgs(DerivedType) 也不會繼承自 EventArgs(BaseType)。 因此,使用 EventArgs(BaseType) 將防止以后使用該類型的派生版本。

這不存在的原因是因為最終會發生的是你實現了這個,然后當你去填寫 T 時,你應該創建一個具有強類型明確屬性的類,作為事件 arg 的數據包,但是實施到一半時,您意識到沒有理由不讓該類繼承 EventArgs 並稱其為好的。

除非您只想要一個字符串或類似的基本數據包,在這種情況下,.NET 中可能有 EventArgs 類標准,它們旨在滿足您所達到的任何簡單目的。

暫無
暫無

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

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