6
votes

Dynamique lancée à un type spécifique

Je récupère JSON avec un type d'objet différent dans une partie. J'ai fait cette partie comme dynamique.

J'ai besoin d'obtenir des données de cet objet afin que j'ai créé la classe qui ressemble à la même chose que les données dynamiques telles que ci-dessous: P>

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


1 commentaires

Quel est le contenu de jsonobj.some ?


3 Réponses :


0
votes

Lorsque vous utilisez comme code> pour casting, il attribue null code> à la destination si la source est null ou que ce n'est pas convertible. Vous ne pouvez donc pas l'utiliser avec des types de valeur. Où comme ceci ( jsonobj.some = (spécifiqueObject1) jsonobj.some code>) jette invalidalcastxception code> si la source est null ou non convertible.

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


2 commentaires

Jette une exception que j'ai à nouveau emballé et que les propriétés sont les mêmes; (


@miechooy: ce qui signifie que soit la source est null ou non convertible.



6
votes

Vous ne pouvez pas modifier le type d'objet - Soyez-le dynamique code> ou tout autre type de compilation. Ainsi, même si vous assignez jsonobj.some comme spécificitéObject1 code> à jsonobj.some code> Vous ne pouvez pas changer son em> compiletime em> type (probablement dynamique dans votre cas que est em> un type de compilétime).

Cela impliquerait que vous puissiez à cela: p> xxx pré>

qui est évident non-sens. A code> est de type int code> qui ne peut pas être changé. Donc, même si vous souhaitez lancer a code> à une chaîne code>, vous ne pouvez pas attribuer le résultat (qui serait de type Sting code>) sur A code> car A code> est de type int code>. p>

la même chose s'applique à une instance de dynamique code> : P>

jsonObj.Some.Title = "NewTitle";


0 commentaires

2
votes

Vous pouvez utiliser une fonctionnalité SLAPPER.Automapper. Utilisez MapDynamic () méthode pour vos besoins.

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" );
}


1 commentaires

Merci de pointer vers Slapper.Automapper. Astuce: Il y a même une préerelase sur Nuget pour .NET Standard ( # 44 ).