2016-12-28 6 views
1

私は辞書を持っています - そのキーはSystem.Typeです。私は辞書の項目をさらに制約しません。ただし、辞書はパブリッククラスインターフェイスを介してのみ公開されます。私はイベントシステムを模倣しています。タイプセーフティ用の汎用パラメータとしてSystem.Typeを制約します

System.Collections.GenericDictionary次のようになります。しかし、私はクラスのユーザーができるようにしたくない

public bool RegisterEventResponse<T>(Type eventType, Func<T> function) 

辞書は、次の署名を持って公開する方法の
private Dictionary<Type, HashSet<Func<T>>> _eventResponseMap; 

ワンこの署名によって辞書にを追加します。 Typeパラメータをさらに制約する方法はありますか?

public bool RegisterEventResponse<T>(Type eventType, Func<T> function) where Type : ICustomEventType 
+0

おそらく上記のコードにはゴミがあります。あなたがそれを過ぎて見ることができるなら、それはすばらしいでしょう。私はここ暗闇の中で概念的に撮影しています – Thomas

+1

'タイプ'の代わりに、 'T2'のような別のジェネリックタイプを使用して、あなたが望む特定のタイプに制限することができます。 [これは既にここで回答されています](http://stackoverflow.com/a/4834066/4767498)ポリシーパターンを使用します。正しいタイプが使用されていない場合、この方法ではコンパイル時エラーが発生します。より簡単なアプローチは、実行時に型をチェックすることです。 –

答えて

2

なぜ、あなたのメソッドのシグネチャを変更しませんか?

public bool RegisterEventResponse<TEvent, TReturn>(Func<TReturn> function) 
    where TEvent: ICustomEventType 
{ 
    _eventResponseMap[typeof(TEvent)] = function; 
} 

はい、タイプ推論を失いますが、タイプの安全性が得られます。 RegisterEventResponse(typeof(CustomEvent),() => 1)を書く代わりに、RegisterEventResponse<CustomEvent, int>(() => 1)と書く必要があります。

+0

これは私が好きです。この外観の呼び出しは、おおよそどのようなガベージタイプを使って実証する必要がありますか? – Thomas

+2

これは私がパラメータを追加することによって意味したものです。 – BradleyDotNET

+0

@BradleyDotNETこれを受け入れるかどうか気になりますか?これは私が必要とするもののようなものの非常に明白な例です。ここでたくさん学ぶ。 – Thomas

3

いいえ、あなたはTypeに時間の安全性をコンパイルし得ることはありません:私は本当に欲しい

は(擬似コード)に似ものです。

あなたが探しているTypeオブジェクトを取得するにはRegisterEventResponsetypeofを使用し、その後ICustomEventTypeTを制限(またはパラメータを追加する)ことができます。

また、単に例外をスロー:

if (!typeof(ICustomEventType).IsAssignableFrom(typeof(T)) 
{ 
    throw new ArgumentException("Type is not supported"); 
} 
+0

この場合、エラーを投げることさえ考えられませんでした。コンパイル時の安全性が達成可能であればいいかもしれません(実現可能かどうかわかりません)。エラーの問題の1つの問題は、ユーザーが実装の詳細をより親密にする必要があることを意味します。これは巨大な異論ではありませんが、あなたは知っています。 – Thomas

+1

@トーマスコンパイル時の安全性を得るための唯一の方法は、私の中間段落のように実際のジェネリックパラメータ( 'Type'ではなく)を制約することです。 – BradleyDotNET

+0

@Thomasや、たくさんの異なるタイプがない場合は、異なるメソッドオーバーロードを書くことができます。どのようにこれはDRYの問題を引き起こす可能性があります。 –

関連する問題