1

ビューモデルが動的モデルである非常に動的なSilverlightアプリケーションに取り組んでいます。WCFサービスは、十分な情報(TableNameプロパティとエンティティを含むDictionary []配列)を含むResponseオブジェクトを返します。

したがって、単一のエンティティ(Dictionary)と、任意の種類のオブジェクトであるviewmodelのインスタンスがあるとします。ディクショナリのキーはプロパティ名として機能し、明らかに、値はビューモデルでプロパティ値を設定するために使用されます。このディクショナリの値を動的ビューモデルの値にマップする必要があります。その逆も同様です。このマッピングにいくつかの制約を設けるために、ディクショナリの値を検証するためのインターフェイスを作成しました。そのため、値propertynamesがコントラクトで定義されている場合にのみ、値を取得/設定します。

ダックタイピング、動的プロキシ、オブジェクトマッパーについて知っており、リフレクションの使用方法も知っています。

私はこのタスクを簡単にすることができるいくつかのツールまたはフレームワークを探し始めました。だから私はImpromptu-Interfaceを見つけました。Impromptu-interfaceでこれを行おうとしています:

  public static TContract MapFromDictionary<TContract>(object bindingModel, Dictionary<string, object> data) where TContract : class {
  var proxy = new ImpromptuDictionary(data).ActLike<TContract>();
  var properties = Impromptu.GetMemberNames(proxy);
  foreach (var propertyName in properties) {
    object value = Impromptu.InvokeGet(proxy, propertyName);
    Impromptu.InvokeSet(bindingModel, propertyName, value);
  }
  return bindingModel.ActLike<TContract>();
}

チャームのように機能します。

そして逆マッピング:

  public static Dictionary<string, object> MapToDictionary<TContract>(object source) where TContract : class {
  var proxy = source.ActLike<TContract>();
  var result = new Dictionary<string, object>();
  var properties = Impromptu.GetMemberNames(proxy);

  foreach (var propertyName in properties) {
    object value = Impromptu.InvokeGet(proxy, propertyName);
    result.Add(propertyName, value);
  }

  return result;
}

問題は、これを行うためのより良い方法はありますか?

4

1 に答える 1

0

foreach の代わりに LINQ の ToDictionary メソッドを使用できるはずです。コレクションの場合、キーを取得する方法を示すラムダのみが必要です。

于 2013-01-31T15:48:39.897 に答える