Development Tip

.NET에는 기본 제공 EventArgs가 있습니까?

yourdevel 2020. 10. 5. 21:03
반응형

.NET에는 기본 제공 EventArgs가 있습니까??


단일 인수를 전달하는 이벤트 인수에 대한 일반 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
};

THERE IS NO BUILT-IN GENERIC ARGS. If you follow Microsoft EventHandler pattern, then you implement your derived EventArgs like you suggested: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }.

HOWEVER - if your team style guide accepts a simplification - your project can use a lightweight events, like this:

public event Action<object, string> MyStringChanged;

usage :

// 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);

Usually a PoC projects use the latter approach. In professional applicatons, however, be aware of FX cop justification #CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx


The problem with a generic type is that even if DerivedType inherits from BaseType, EventArgs(DerivedType) would not inherit from EventArgs(BaseType). Using EventArgs(BaseType) would thus prevent later using a derived version of the type.


The reason this does not exist is because what would end up happening is you implement this, and then when you go to fill in the T you should create a class with strongly typed unambiguous properties that acts as the data bag for your event arg, but halfway through implementing that you realize there's no reason you don't just make that class inherit from EventArgs and call it good.

Unless you just want a string or something similarly basic for your data bag, in which case there are probably EventArgs classes standard in .NET which are meant to serve whatever simple purpose you're getting at.

참고URL : https://stackoverflow.com/questions/3312134/does-net-have-a-built-in-eventargst

반응형