2016-06-28 157 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到目的地,如果源爲null,或者它是不可自由兌換。所以你不能用它的值類型。如果這個(jsonObj.Some = (SpecificObject1)jsonObj.Some)將拋出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 SpecificObject1指定爲jsonObj.Some,您也不能更改其編譯時間類型(在您的情況下可能爲dynamic,其中爲編譯時類型)。

這將意味着你可以這樣:

int a = 3; 
a = a as string; 

這是明顯的非感。 aint類型,不能更改。因此,即使您*可以將a轉換爲string,您也無法將結果(類型爲sting)指定爲a,因爲a實際上屬於int類型。

這同樣適用於dynamic一個實例:

dynamic b = a as Bar; 

這仍然將計算爲b存在dynamic類型。但是,如果a之前是Bar,那麼b的運行時類型肯定也是Bar。無論如何,你沒有得到這個演員的任何東西,因爲編譯時型b仍然是dynamic - 使它成爲一個空操作。

編輯:爲了讓您可以使用,你必須創建一個基於jsonObj.SomeSpecificType一個新實例的編譯時類型:

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

但是你不容分配這jsonObj.Some和期望後者在編譯時爲SpecificObject。無論如何,因爲它已經是dynamic你可以做你想做的事情的一切,例如設置其Title

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"); 
} 
相關問題