.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の代理人を定義する
私はPersonally CorpodiceTagcodeがフィット感の良いものと非常に良いと感じません。イベントargsの「ペイロード」として使用される情報は、私の意見では、使用量と予想されるプロパティを非常に明確にするためのカスタムクラスです。一般的なクラスを使用すると、意味のある名前を所定の名前に入れることができなくなります。(データ "は何を表しますか?)
他のヒント
私はここにすべての「純粋主義者」を理解していないと言わなければなりません。 すでにあなたがすでにバッグクラスを定義している場合 - すべての詳細、プロパティなどがあります。なぜハックがイベント/ argsメカニズム、署名スタイルに従うことができるようにハックが1つの余分な不要なクラスを作成しますか? ものは.NETのすべてのものではありません - またはその問題のために 'から欠けていることです - 「良い」 - MSは何年もの間'それ自体を修正しています... 私はちょうど行って作ってください - 私がしたようなものを作ってください - 私はそのようなものと同じようにそれを必要としていた - そして私を多くの時間を節約しました、
それは存在します。少なくとも、今はそうです。
発見できる 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));
}
}
.
//とFinnaly objadded イベント
を購読することができますSubscriberObj.ObjAdded += (object sender, GenericEventArgs<TargetObjType> e) =>
{
// Here you can explore your e.EventData properties
};
. 組み込みの一般的なargsはありません。
Microsoft EventHandlerパターンに従う場合は、推奨されるような派生イベントargを実装します。
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 Jostification#CA1009に注意してください。msdn.microsoft.com/en-us/library/ms182133.aspx
一般的なタイプの問題は、erivedTypeがBaseTypeから継承していても、EventArgs(erivedType)からeventargs(baseType)から継承しないことです。したがって、EventArgs(BaseType)を使用すると、後で導出バージョンのタイプを使用するのが防止されます。
これが存在しない理由は、起こったことがこれを実装しているためです、そしてTを記入するときは、あなたのイベントのデータバッグとして機能する強く型付けされた明確なプロパティを持つクラスを作成する必要があります。arg、しかし、あなたがそのクラスをeventargsから継承し、それを良く呼びかけるだけではない理由はありません。
あなたがあなたのデータバッグのために文字列や基本的なものを望んでいない限り、その場合はeventargsクラス標準があります。