1

「タスク」と呼ばれるビジネス エンティティを含むアプリケーションがあります。このエンティティには固定のプロパティ セットがありますが、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;
    }
}
4

2 に答える 2

3

実行時に dynamic は単なるオブジェクトであることを覚えておいてください。実際に何を意味していたのかを知る方法はありません。代わりに RavenJObject を使用したほうがよい場合があります。動的データを扱うより自然な方法であり、型情報を保持します

于 2011-09-22T05:36:38.040 に答える
1

この場合、使用を避けるdynamicのが最善かもしれません。Dictionary<string, object>代わりにa を使用する場合、 aを作成するTaskことはそれほど恐ろしいことではありません。

new RavenResearch.Task {
    TaskId = Guid.NewGuid(),
    CreatedDate = DateTime.Now,
    DynamicProperties = new Dictionary<string, object> {
        { "MatterNumber", 0 },
        { "CustomerNumber", "37" } 
    }
}
于 2011-09-21T23:55:52.603 に答える