ビューモデルが動的モデルである非常に動的な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;
}
問題は、これを行うためのより良い方法はありますか?