2015-11-19 13 views
5
class Foo<T> 
{ 
    public T Bar() { /* ... */ } 
} 

私はバーの名前をType.GetMethod(string)に渡したいと思います。私はこれをsomeType.GetMethod(nameof(Foo<int>.Bar))として行うことができますが、intは完全にここでは任意です。私はそれを省略することができる方法はありますか?悲しいことに、nameof(Foo<>.Bar)は動作しません。タイプ引数を指定せずにジェネリッククラスのメンバーにnameofを使用

このおもちゃの場合はそれほど大したことではありませんが、複数のタイプのパラメータがあり、特にそれらに制約が付いている場合は、それらすべてをスペルアウトすることができます。

答えて

3

nameof documentationは、具体的に何がやりたいことは、残念ながら、禁止されていることを述べている:

引数が構文的に表現する必要があるため、 はリストに有用ではありません禁止多くのものがあります。以下 は、エラーを生成言及する価値がある:事前定義されたタイプ( 例えば、intまたはvoid)、null許容型(Point?)、配列型 (Customer[,])、ポインタ型(Buffer*)、修飾エイリアス(A::B)、及び Dictionary<,>、前処理記号(DEBUG)、 およびラベル(loop:)。

インターフェイスでBarを指定し、nameof(IFoo.Bar)と指定するのが最善の方法です。もちろん、Barには、Tに関連するものが含まれている場合(この特定の場合のように)、オプションではありません。


別のオプションは、各Tobjectに置き換えられインターフェースを作成することです。次に、具体的な型は明示的にインタフェースを実装し、同じメソッドのジェネリック版も実装します。

これは、いくつかの欠点があります。

  • 大きなAPI表面
  • より困難とエラーが発生しやすい呼び出し側がobjectインタフェースを使用する場合がありますので、コンパイル時の型の安全性を失う
  • をリファクタリング。

これはおそらくnameofを使用するのは正当な理由ではありませんが、場合によってはこの戦略は他の理由からも意味があります。そのような場合、nameofを使用できることは便利なボーナスに過ぎません。

+0

"バーには、その署名にTに関連するものが含まれているとします。"これはまさに私の場合です(これを含む質問を編集しました)。まぁ。 – dlf

+0

この場合、とにかく、私はむしろいくつかの不要な型引数を入力したいと思います。一つのこととして、 '' Bar'の 'T'バージョンと' object'バージョンの両方を持つと、最初に解決するために 'nameof'が導入されたのと同じ名前の変更後バグにコードが脆弱になります。もし私がそれを許容する準備ができていれば、 'GetMethod(" Bar ")'をするだけで簡単になります。人生は続く。 :) – dlf

+0

@dlf合意。私のコメントの内容を後世の答えに移しました。 – 31eee384

関連する問題