문제

단일 인수를 전달하는 이벤트 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 #을 제공합니까?당신의 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

아니오.당신은 아마도 "NoReferRer"> EventHandler<T> 를 생각하고있었습니다.특정 유형의 EventArgs에 대한 대리자를 정의합니다.

나는 개인적으로 EventArgs<T>가 적합성의 좋은 것처럼 느끼지 않는다고 느끼지 않습니다.Event args의 "페이로드"로 사용되는 정보는 내 의견으로 사용해야하며 사용자 정의 클래스는 사용 및 예상 속성을 매우 명확하게 만듭니다.일반 클래스를 사용하면 의미있는 이름을 제자리에 넣을 수 없게됩니다.( "데이터"는 무엇을 나타내는가?)

다른 팁

나는 모든 '순결주의자를 이해하지 못한다고 말해야합니다. I.E. 귀하가 이미 모든 특성, 특성 등이있는 가방 클래스가 정의 된 경우 - 해킹은 이벤트 / args 메커니즘, 서명 스타일을 따를 수있는 한 여분의 불필요한 클래스를 만듭니다. 일은 - .NET에있는 모든 것이 아닙니다. 그렇지 않으면 해당 문제에 대해 '누락'이 아닙니다. 나는 그냥 가서 내가 한 것처럼 만들어야한다고 말하고 싶다. 왜냐하면 나는 그처럼 필요했다 - 그리고 많은 시간을 구원했다.

그것은 존재합니다.적어도 그것은 지금 그것을합니다.

DataEventArgs<TData> 일부 다른 Microsoft 어셈블리에서 찾을 수 있습니다./ Microsoft.Practices.prism.Events ...에그러나 프로젝트에 자연을 포함 할 수있는 네임 스페이스는 자신의 구현을 사용하기 만하면됩니다.

프리즘 를 사용하지 않기로 선택하지만 여전히 시도하고 싶습니다.일반 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 COP 정당화 # CA1009 : https : //msdn.microsoft.com/en-us/library/ms182133.aspx

일반 유형의 문제점은 derivedType이 BaseType에서 상속 되더라도 EventArgs (DerivedType)가 EventArgs (BaseType)에서 상속되지 않아도됩니다.따라서 EventArgs (BaseType)를 사용하면 나중에 유형의 파생 버전을 사용하여 방지합니다.

이 사건이 존재하지 않는 이유는 일어나는 일이 무엇인지이를 구현하는 것입니다. 그런 다음 이벤트를위한 데이터 가방 역할을하는 강력한 입력 된 모호하지 않은 속성을 강력하게 입력 한 클래스를 만들어야합니다.arg, 그러나 당신이 이유가 없다는 것을 깨닫는 것을 구현하는 것을 구현하는 것은 그 수업이 eventargs에서 상속 받고 그것을 잘 부르지 만

단지 데이터 가방에 유사하게 기본적으로 기본적으로 기본적으로 원하는 경우가 아니라면 eventArgs 클래스 클래스 표준이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top