0

基本クラスから2レベル上の「派生」(正しい言葉です)のサブクラスがあります。このクラスのすべてのプロパティのリストがあります (そのため、親からのプロパティと親の親が含まれます)。私が欲しいのは、DeclaringType が「CrazyNinjaBadger」であるプロパティだけです (つまり、サブクラスのプロパティのみ)。

私はこの声明を試しました:

PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");

しかし、私はただ得ます

「型 'System.Collections.Generic.IEnumerable' を 'System.Reflection.PropertyInfo[]' に暗黙的に変換することはできません。

誰かが機能するステートメントを提案できますか?

4

6 に答える 6

3

Whereプロパティをフィルタリングし、結果を配列に変換するために使用します。

PropertyInfo[] properties = type.GetProperties()
             .Where(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
             .ToArray();

また、このようなタイプ名を使用したいと思いますx.DeclaringType.Name == "CrazyNinjaBadger"。あなたのケースでは、演算子Selectはプロパティを一連のブール値に投影します。そのため、クエリは実際にはIEnumerable<bool>CrazyNinjaBadger と比較した文字列型の結果を返します。

于 2013-02-14T14:06:33.163 に答える
1

行末ToArray()に追記

PropertyInfo[] properties = type.GetProperties()
    .Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
    .ToArray();
于 2013-02-14T14:05:31.547 に答える
1

Select()常にIEnumerableを返すため、そのエラーが発生しています。

.ToArray()行末に追加するだけで機能します。

于 2013-02-14T14:06:01.677 に答える
1
PropertyInfo[] properties = type.GetProperties()
                   .Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger")
                   .ToArray();

配列に変換するには、ToArray() を追加する必要があります...

于 2013-02-14T14:06:09.573 に答える
1

あなたはほとんどそこにいました!Select は IEnumerable を返しますが、PropertyInfo 配列の値を設定しようとしています。必要なのは、ToArray への追加の呼び出しだけです。

PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger").ToArray()
于 2013-02-14T14:07:44.423 に答える
1
PropertyInfo[] properties = type.GetProperties().Select(x => x.DeclaringType.ToString() == "CrazyNinjaBadger");

Select(...)の実装を返しますIEnumerable<T>。コンパイラ エラーは非常に明白です。

もう 1 つのポイントは、プロパティをフィルター処理することです。.Select(...)列挙型を同じまたは他の型の別の型に射影するためのものです。

例えば:

IEnumerable<string> strings = new string[] { "0", "1" };

// Converting the string enumerable to an enumerable of integers:
IEnumerable<int> integers = strings.Select(some => int.Parse(some)); 

// Also, convert each strings into an anonymous object!
IEnumerable<object> whoKnows = strings.Select(some => new { Value = some }); 

列挙型をフィルタリングするには、を使用する必要があります.Where(...)

一方、x.DeclaringType.ToString() == "CrazyNinjaBadger"は正しいですが、そうあるべきです(プロパティがあるx.DeclaringType.Name == "CrazyNinjaBadger"ため、型を文字列に変換する必要はありません)。TypeName

最後に、結果を配列に設定する必要はないと主張します。これを行うだけで済みます。

IEnumerable<PropertyInfo> properties = 
       type.GetProperties()
          .Where(x => x.DeclaringType.Name == "CrazyNinjaBadger");
于 2013-02-14T14:09:15.617 に答える