2016-06-28 2 views
2

다른 객체 유형을 가진 JSON을 한 부분에서 가져옵니다. 이 부분을 동적으로 만들었습니다.특정 유형에 동적으로 캐스트

:

여기
public class SpecificObject1 
{ 
    public string Title{get; set;} 
    public object[] ViewElements{get; set} 
    public object AnyAttributes{get; set;} 
} 

내가이 특정 객체로 변환하는 방법이다 : 나는 다음과 같은 동적 데이터와 동일한 보이는 클래스를 만들 수 있도록

나는이 객체에서 데이터를 얻을 필요

var @switch = new Dictionary<Type, Action> { 
       { typeof(x),() => jsonObj.Some = jsonObj.Some as SpecificObject1}, 
       { typeof(y),() => ......} 
      }; 

캐스팅은 as입니다.

편집 : 진짜

동적으로 변경 속성이 포함되어 소스가 null하거나 전환하지 않은 경우

AnyAttributes: {object} 
Title: "title" 
ViewElements: object[0] 
+0

'jsonObj.Some'의 내용은 무엇입니까? – HimBromBeere

답변

0

당신이 주조 as를 사용하는 경우, 그것은 대상에 null을 지정합니다. 따라서 값 유형에는 사용할 수 없습니다. where (jsonObj.Some = (SpecificObject1)jsonObj.Some)는 소스가 null이거나 변환 할 수없는 경우 InvalidCastException을 발생시킵니다.

var @switch = new Dictionary<Type, Action> { 
       { typeof(x),() => jsonObj.Some = (SpecificObject1)jsonObj.Some }, 
       { typeof(y),() => ......} 
      }; 
+0

예외를 던졌습니다. 다시 채 웁니다. 속성은 같습니다. ( – miechooy

+2

@miechooy : 이는 소스가 null이거나 변환 할 수 없음을 의미합니다. –

4

당신은 객체의 유형을 변경 할수 없어 - 그것은 dynamic 또는 기타 컴파일시의 형태합니다. 따라서 jsonObj.Some as SpecificObject1jsonObj.Some에 할당하더라도 컴파일 타임을 유형 (아마도 dynamic 컴파일 타임 형식 임)으로 변경할 수 없습니다.

이이 위해 할 수있는 의미하는 것 : 비 감지 분명하다

int a = 3; 
a = a as string; 

합니다. a은 변경할 수없는 int입니다. 따라서 사용자가 astring으로 전송할 수있는 경우 a은 실제로 int이기 때문에 결과 (sting 유형)는 a으로 할당 할 수 없습니다.

동일 dynamic의 인스턴스에 적용이 여전히 유형 dynamicb 존재로 평가됩니다

dynamic b = a as Bar; 

. 그러나 aBar-instance 이전이면 b의 런타임 유형은 반드시 Bar입니다. 어쨌든 컴파일 유형의b 인이 캐스팅으로는 아무 것도 얻지 못합니다. 여전히 dynamic입니다. 아무 작업도하지 않습니다.

편집 : 당신은 당신이 jsonObj.Some에 따라 SpecificType의 새 인스턴스를 만들 필요가 사용할 수있는 컴파일시의 형태 얻기 위하여 :

var newValue = new SpecificObject { 
    Title = jsonObj.Some.Title, 
    ViewElements = jsonObj.Some.ViewElements, 
    AnyAttributes = jsonObj.Some.AnyAttributes 
} 

을 당신은 jsonObj.Some이를 할당하고 기대 할수 없어 그러나 후자는 컴파일시에 SpecificObject 유형이어야합니다.그것은 이미 어쨌든로 인스턴스가 Title을 설정하기위한 dynamic 당신은 당신이 그것으로 원하는 모든 작업을 수행 할 수 있습니다

jsonObj.Some.Title = "NewTitle"; 

는이에 대한 캐스트를 필요로 이뤄져.

0

Slapper.AutoMapper 기능을 사용할 수 있습니다. 필요에 따라 MapDynamic() 메서드를 사용하십시오.

public class Person 
{ 
    public int Id; 
    public string FirstName; 
    public string LastName; 
} 

[Test] 
public void Can_Map_Matching_Field_Names_Using_Dynamic() 
{ 
    // Arrange 
    dynamic dynamicPerson = new ExpandoObject(); 
    dynamicPerson.Id = 1; 
    dynamicPerson.FirstName = "Clark"; 
    dynamicPerson.LastName = "Kent"; 

    // Act 
    var person = Slapper.AutoMapper.MapDynamic<Person>(dynamicPerson) as Person; 

    // Assert 
    Assert.NotNull(person); 
    Assert.That(person.Id == 1); 
    Assert.That(person.FirstName == "Clark"); 
    Assert.That(person.LastName == "Kent"); 
} 
관련 문제