2017-02-02 4 views
0

私は、一般的なリストを持っているアイテムを取得しようとした値に基づいて、すなわち、ジェネリックリストfirstOrDefault

list.FirstOrDefault(u=>u.Key == key) // error 'T' does not contain definition for 'Key' 

異なる基底クラスを持つジェネリック型T

+1

「Key」プロパティを持つインターフェイスを作成し、このメソッドを使用するすべてのクラスで実装する必要があります。 – krillgar

+0

'Key'パラメータは、GroupBy()を実行するときにのみlinqによって生成されます。あなたのリストはGroupBy()メソッドから来ていますか? – jdweng

+0

リストの宣言を表示できますか? – Theo

答えて

2

Tがどこに塗りつぶされているかに応じて、汎用の制約を指定して、インターフェース(または基本クラス)を持つことができます。

インタフェース:

interface IHasKey { string Key { get; } } // or some other type for `Key` 

ジェネリック制約:

where T : IHasKey 
+0

貴重な情報をお寄せいただきありがとうございます –

1

あなたはTが指定されておらず、Tクラスは、任意のフィールド/プロパティのキーが含まれている場合ので、私たちが知らないながらキーを使用しようとしています。 あなたができることは、抽象クラス/インターフェースを使うことです。あるいは、 "Key"を含むクラスにuをキャストしようとすることです(いくつかのクラスを特別に想定していると仮定します)。より正確な答えを得るには、あなたのリストとそのアイテムに関する詳細が必要です。 お手伝い願います!

1

一般的な方法を使用する場合は、TにプロパティKeyがあることを確認する必要があります。これは一般的な制約で実現できます。

+0

貴重な情報をお寄せいただきありがとうSefe –

関連する問題