「タスク」と呼ばれるビジネス エンティティを含むアプリケーションがあります。このエンティティには固定のプロパティ セットがありますが、expando として動作する機能もあります。
したがって、そのスキーマは次のようになります。
namespace RavenResearch
{
public class Task
{
public Guid TaskId { get; set; }
public DateTime CreatedDate { get; set; }
public dynamic DynamicProperties { get; set; }
}
}
これを RavenDB に格納すると、このようになります
{
"TaskId": "9cac592f-98ec-4fda-a823-e5402736078e",
"CreatedDate": "2011-09-22T10:25:35.2701544+12:00",
"DynamicProperties": {
"$type": "<>f__AnonymousType0`2[[System.Int32, mscorlib],[System.String, mscorlib]], RavenResearch",
"MatterNumber": 0,
"CustomerNumber": "37"
}
}
もちろん、別のプログラムからこのデータストアにクエリを実行しようとすると、int と string を含む匿名型を検索しようとします。その他のプログラムは、ドキュメントを最初に保存した EXE です。これを参照する必要はありません。
動的プロパティを引き出す最良の方法は何ですか? 私の目標は、Raven から Task オブジェクトのリストを照会し、それらを UI でレンダリングするために Xaml に渡すことができるようにすることです。これが、Expando へのデータ バインディングが非常に魅力的である理由であり、コンパイル時にプロパティを知る必要はありません。
このようなステートメントを使用して (Raven に格納する) インスタンスを作成します
new RavenResearch.Task()
{
TaskId = Guid.NewGuid(),
CreatedDate = DateTime.Now,
DynamicProperties = new
{
MatterNumber = 0,
CustomerNumber = "37"
}
}
@Jacob: 辞書を使用すると、動的プロパティに関するすべての型情報が失われますが、次のようなことができます。
public class Task
{
public Guid TaskId { get; set; }
public DateTime CreatedDate { get; set; }
public Dictionary<string, SimpleValue> DynamicProperties { get; set; }
}
public abstract class SimpleValue
{
}
public class SimpleValue<T> : SimpleValue
{
public T Value
{ get; set; }
public SimpleValue(T value)
{
this.Value = value;
}
}