[c#] .NET에는 기본 제공 EventArgs <T>가 있습니까?

단일 인수를 전달하는 이벤트 인수에 대한 일반 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>적합 하다고 생각하지 않습니다 . 이벤트 인수에서 “페이로드”로 사용되는 정보는 사용 및 예상 속성을 매우 명확하게 만드는 사용자 정의 클래스 여야합니다. 제네릭 클래스를 사용하면 의미있는 이름을 제자리에 넣을 수 없습니다. ( “데이터”는 무엇을 의미합니까?)


답변

나는 여기서 모든 ‘순수 주의자’를 이해하지 못한다고 말해야한다. 즉, 모든 세부 사항, 속성 등을 포함하는 가방 클래스가 이미 정의되어있는 경우 해킹이 이벤트 / 인수 메커니즘, 서명 스타일을 따를 수 있도록 하나의 불필요한 클래스를 추가로 만드는 이유는 무엇입니까? 문제는-.NET에있는 모든 것이 아니라-또는 그 문제에 대해 ‘누락 된’것이 아닙니다- ‘좋은 것’입니다-MS는 수년 동안 스스로를 ‘수정’해 왔습니다. -저도 그렇게 필요했기 때문에-많은 시간을 절약했습니다.


답변

존재합니다. 적어도 지금은 그렇습니다.

DataEventArgs<TData>예를 들어 Microsoft.Practices.Prism.Events 와 같은 일부 다른 Microsoft 어셈블리 / 네임 스페이스에서 찾을 수 있습니다 . 그러나 이들은 프로젝트에 포함하는 것이 자연스럽지 않은 네임 스페이스이므로 자체 구현을 사용할 수 있습니다.


답변

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 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를 채울 때 이벤트 인수에 대한 데이터 백 역할을하는 강력한 유형의 명확한 속성을 가진 클래스를 만들어야하기 때문입니다. 구현 중간에 해당 클래스를 EventArgs에서 상속하도록 만들고이를 good이라고 부르지 않을 이유가 없다는 것을 알게되었습니다.

데이터 백에 대해 문자열이나 이와 유사한 기본적인 것을 원하지 않는 한,이 경우 .NET에있는 EventArgs 클래스 표준이있을 것입니다.