2011-09-21 5 views
1

'업무'라는 비즈니스 엔터티가 포함 된 응용 프로그램이 있습니다. 이 엔터티에는 고정 된 속성 집합뿐 아니라 확장 속성으로 작동하는 기능이 있습니다. 이것은 RavenDB에 저장되어 언제 다른 프로그램에서이 데이터 저장소를 조회 할 때익명 형식을 역 직렬화로 역 직렬화

namespace RavenResearch 
{ 
    public class Task 
    { 
     public Guid TaskId { get; set; } 
     public DateTime CreatedDate { get; set; } 
     public dynamic DynamicProperties { get; set; } 
    } 
} 

, 그것은, liks에게 물론이

{ 
    "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와 문자열을 포함하는 익명 형식을 찾습니다. 다른 프로그램은 원래 문서를 저장 한 EXE 파일입니다.이 파일을 참조해야 할 필요는 없습니다.

동적 속성을 제거하는 가장 좋은 방법은 무엇입니까? 제 목표는 Raven의 Task 객체 목록을 쿼리하고이를 UI에서 렌더링하기 위해 Xaml에 전달할 수 있다는 것입니다. 이것이 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

그렇다면 Matter Number 및 Customer number에 대한 모든 유형 정보가 손실됩니다. – Adam

+0

그들은 여전히 ​​int와 string입니다. – Jeremy

3

실행시에 그 기억, 동적 단순히 우리가 실제로이 무엇을 의미하는지 알 방법이 없습니다, 객체입니다. 그 대신에 RavenJObject를 사용하는 것이 더 나을 것입니다. 동적 데이터로 작업하는 것이 더 자연스러운 방법이며, 형식 정보를 유지합니다.

+0

감사합니다 아옌데, 나는이 길로 갈 수 있습니다 ... – Adam