2017-11-11 7 views
0

クエリ文字列に基づいてオブジェクトを返そうとしています。
たとえば、api/users/{id}?fields=username,email,reputationには、3つのプロパティ(ユーザー名、電子メール、レピュテーション)のみを含むUserタイプのオブジェクトを返すようにします。クエリ文字列に基づいてオブジェクトを返す

.NET Coreでは、カンマ区切りのクエリ文字列はデフォルトでは使用できません。
Here's a tutorial on making that work

上記のガイドに続いて、私は文字列のリストを持っています。それらの文字列の名前と一致するプロパティのみを含むオブジェクトを作成するにはどうすればよいですか?私はこれを行うことができますわずか数文字列(感謝ベン・ホール)の場合

List<string> listOfStrings ...; // Strings from query 
User user = GetUser(id); // User from db 

User newUser = new User(); 

if (listOfStrings.Contains("username")) 
    newUser.username = user.username; 
if (listOfStrings.Contains("email")) 
    newUser.email = user.email; 
if (listOfStrings.Contains("reputation")) 
    newUser.reputation = user.reputation; 

しかし、文字列の長いリストについては、(私のユーザークラスは30+性質を持っている)どのように私はこれをやって行くのでしょうか?

参考として、Facebook Graph APIこれを行います。

+0

オブジェクトあなたのAPIに関連するコンテキストを設定します'' newUser'には名前が付けられていますが、なぜ...? asp.netの場合、クエリ文字列にない 'user'のものを表示しないでください。 –

+0

これらの特質を持つ匿名オブジェクトを返すことができます。 – CodingYoshi

+0

私はifステートメントの配置を間違えていました。 –

答えて

0


今foreachの要素Turns out there is actually Middleware for this called Popcorn.

ポップコーンはRESTfulなAPIの上にある通信プロトコルで、リクエストするクライアントがリソースまたはリソースの収集を取り込むときに含める個々のリソースのフィールドを識別できるようにします。

フィールドの再帰的な選択が可能で、複数のコール を1つに圧縮することができます。

特長:RESTfulなAPIから

  • 選択インクルージョン
  • 設定可能な応答のデフォルト応答の
  • ソート
  • 選択承認と応答の許認可が値
  • 設定可能な応答検査官
  • 工場とアドバイスNCED投影サポート
  • は応答F
  • ブラインド拡大はあなたが `typeof演算(ユーザー)のパブリックプロパティで使用反射を` _could_のみユーザー `から、これらのフィールドをコピー
1

私たちは反射のような他の方法を模索することができますが、ifはあなたに十分役立ちます。オブジェクトの初期設定でIfを使用しようとすると簡単に間違っているようです。たとえば、新しいUserオブジェクトをインストールした後で、これを行う必要があります。

User newUser = new User(); 
if (listOfStrings.Contains("username")) 
{ 
     newUser.username = user.username; 
} 
+0

潜在的な文字列のリストが長い場合、これはどのように最善の方法になりますか? –

+2

反射領域に入る。私は[類似のもの](https://stackoverflow.com/questions/40041905/web-api-handle-misspelled-fromuri-parameters/40043835#40043835)について話しましたが、正確にはこの問題ではなく、私はこれまでに[文字列名を使用してプロパティにアクセスする](https://stackoverflow.com/questions/2905187/accessing-object-property-as-string-and-setting-its-value) –

2
List<string> listOfStrings ...; // Strings from query 
User user = GetUser(id); // User from db 

User newUser = new User(); 
//gettting object type 
var userType = user.GetType(); 

このソリューションでは、それはメソッドGetValueメソッドとSetValueを
を使用して反射
に関するある程度の知識を必要とする(コードは、Visual Studioでテストされている)listOfStrings

foreach(var propertyName in listOfString){ 
// This line of code retrives the value of the propety in the user class 
var retrivedValue = userType.GetProperty(propertyName).GetValue(user); 
// This line of code sets the value retrived to the property in the newUser class 
userType.GetProperty(propertyName).SetValue(newUser, retrivedValue , null); 
} 
+0

これは動作します、ありがとうございます。私の目標は、newUserオブジェクトを匿名で返すことでした(クエリに与えられたプロパティのみを含む)。これは可能ですか? –

+0

本質的に私はFacebook Graph APIが何をしているのか正確にしたいと思います。返されるJSONオブジェクトには、クエリで指定されたフィールドのみが含まれている必要があります。 –

+0

これは、IDictionary を作成し、foreach内でnullをチェックし、 'propertyName'キーと' retreivedValue'値として保存することで実現しました。私は与えられたプロパティとnullでなかったプロパティだけを含む辞書を返します。これはあなたが上で書いたコードのすべてを使用するのではありませんが、それでもなお学ぶ価値がありました。もう一度あなたの助けをありがとう:) –

関連する問題