强制转换为特定类型
我在一部分中检索具有不同对象类型的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]
当您使用as
铸造,其分配null
到目的地,如果源为null,或者它是不可*兑换。所以你不能用它的值类型。如果这个(jsonObj.Some = (SpecificObject1)jsonObj.Some
)将抛出InvalidCastException
如果任何来源为空或不可转换。
var @switch = new Dictionary<Type, Action> {
{ typeof(x),() => jsonObj.Some = (SpecificObject1)jsonObj.Some },
{ typeof(y),() => ......}
};
抛出异常,我再次查询和属性是相同的;( – miechooy
@ miechooy:这意味着任何来源为null或不可转换。 –
您不能更改对象的类型 - 可以是dynamic
或任何其他编译时类型。因此,即使您将jsonObj.Some as SpecificObject1
指定为jsonObj.Some
,您也不能更改其编译时间类型(在您的情况下可能为dynamic
,其中为为编译时类型)。
这将意味着你可以这样:
int a = 3;
a = a as string;
这是明显的非感。 a
是int
类型,不能更改。因此,即使您*可以将a
转换为string
,您也无法将结果(类型为sting
)指定为a
,因为a
实际上属于int
类型。
这同样适用于dynamic
一个实例:
dynamic b = a as Bar;
这仍然将计算为b
存在dynamic
类型。但是,如果a
之前是Bar
,那么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
。无论如何,因为它已经是dynamic
你可以做你想做的事情的一切,例如设置其Title
:
jsonObj.Some.Title = "NewTitle";
您不需额外需要这方面的任何演员。
您可以使用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");
}
'jsonObj.Some'的内容是什么? – HimBromBeere