2016-09-17 15 views
-1

私は既存のAPIのライブラリを作成しています。私は現在、各要求クラスに対してQueryParameterクラスを持っています。 QueryParameterクラスは単純ですが、変化します(すべての要求が同じクエリパラメータを使用するわけではありません)。ここで匿名オブジェクトのプロパティと値をディクショナリに変換する

はQueryParameterクラスの例である:

public class ApiRequestAQueryParameters 
{ 
    public string Name { get; set; } 
    public int Start { get; set; } 
    public int Stop { get; set; } 
} 

私は私たちのWebクライアントに供給することができ辞書には、このようなクラスを変換する方法に興味があります。

private Dictionary<string, string> GenerateQueryParameters(object queryParametersObject) 
{ 
// perform conversion 
} 

私は

私は理由(リクエストの数十があるでしょう)要求ごとにQueryParameterプロパティを引き出す必要はありません。この方法:私のような再利用可能な方法を有することが期待していますQueryParameterクラスを各APIリクエストクラスのDictionaryプロパティにするのではなく、QueryParameterクラスを使用することは開発者にとって親切です。他の人がクラスを見てこれらのAPIリクエストを作成できるようにしたいと思います。

答えて

0

2つの方法があります:1)反射を使用し、2)jsonとbackにシリアル化します。

private Dictionary<string, string> GenerateQueryParameters(object queryParametersObject) 
{ 
    var res = new Dictionary<string, string>(); 
    var props = queryParametersObject.GetType().GetProperties(); 
    foreach (var prop in props) 
    { 
     res[prop.Name] = prop.GetValue(queryParametersObject).ToString(); 
    } 
    return res; 
} 
0

あなたはこのような何かを行うことができます:

は、ここで第一の方法である

private Dictionary<string, string> GenerateQueryParameters(object queryParameters) 
{ 
    var startStop = new StartStop() { Start = queryParameters.Start, Stop = queryParameters.Stop}; 
    var result = new Dictionary<string, string>(); 
    result.Add(queryParameters.Name, startStop); 
    return result; 
} 

public class StartStop 
{ 
    public int Start { get; set; } 
    public int Stop { get; set; } 
} 
0

これはExpandoObjectsを利用するのに最適なケースかもしれません。 ExpandoObjectは動的な型であり、そのプロパティは実行時に作成できます。 ExpandoObjectはIDictionary < string、object>を実装しているので、<という文字列、オブジェクト>に変換するのは簡単です。

次の例では、ExpandoObjectが作成され、Dictionary <文字列object>に変換され、その後、<という文字列stringに変換されます。

dynamic apiVar = new ExpandoObject(); 
apiVar.Name = "Test"; 
apiVar.Start = 1; 
apiVar.Stop = 2; 

var iDict = (IDictionary<string, object>) apiVar; 
/* if you can utilize a Dictionary<string, object> */ 
var objectDict = iDict.ToDictionary(i => i.Key, i => i.Value); 
/* if you need a Dictionary<string, string> */ 
var stringDict = iDict.ToDictionary(i=>i.Key, i=> i.Value.ToString()); 

また、ExpandoObjectにプロパティを設定するさまざまな方法があります。以下は変数名でプロパティを設定する例です。

dynamic apiVar = new ExpandoObject(); 
var propertyName = "Name"; 
apiVar[propertyName] = "Test"; 
propertyName = "Start"; 
apiVar[propertyName] = 1; 
propertyName = "Stop"; 
apiVar[propertyName] = 2; 
0

私はいつもこのためにRouteValueDictionaryクラスを再利用します。任意のオブジェクトを受け入れ、そのクラス自体がIDictionaryを実装するコンストラクタを持っています。

それは、System.Webのdllファイルで利用可能です

private Dictionary<string, string> GenerateQueryParameters(object queryParametersObject) 
{ 
    return new RouteValueDictionary(queryParametersObject).ToDictionary(d => d.Key, d => Convert.ToString(d.Value)); 
} 
関連する問題