2011-09-21 99 views
1

我有一個應用程序包含一個名爲'Task'的業務實體。該實體具有固定的一組屬性,但也具有表現爲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中查詢任務對象列表,並將它們傳遞給Xaml以便在UI中進行渲染 - 這就是爲什麼對Expando的數據綁定對我來說非常有吸引力,在編譯時不需要知道這些屬性。

我創建實例(在烏鴉存儲),像這樣

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; 
    } 
} 

回答

1

也許避免使用dynamic是最好的情況。如果使用Dictionary<string, object>而是創建一個Task不會是太可怕了:

new RavenResearch.Task { 
    TaskId = Guid.NewGuid(), 
    CreatedDate = DateTime.Now, 
    DynamicProperties = new Dictionary<string, object> { 
     { "MatterNumber", 0 }, 
     { "CustomerNumber", "37" } 
    } 
} 
+0

確實如此,然而我失去了有關MatterNumber和客戶號碼的所有類型信息。 – Adam

+0

它們仍然是int和string。 – Jeremy

3

請記住,在運行時,動態是根本反對,我們無法知道你實際上意味着那裏的方式。 您可能更適合使用RavenJObject。這將是一種更自然的使用動態數據的方式,它將保存類型信息

+0

謝謝Ayende,我最終可能會走這條路...... – Adam

相關問題