2016-06-28 64 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"); 
} 
相关问题