142 votes

Comment puis-je vérifier si une propriété existe sur un type anonyme dynamique en c#?

J'ai un objet de type anonyme que je reçois en tant que dynamique à partir d'une méthode J'aimerais vérifier si une propriété existe sur cet objet.

....
var settings = new {
                   Filename="temp.txt",
                   Size=10
}
...

function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}

Comment implémenterais-je IsSettingExist ?

2 votes

0 votes

Si vous trouvez que vous vous appuyez fortement sur des objets dynamiques, il est probablement utile de jeter un coup d'œil à F# - Joli avatar d'ailleurs.

180voto

DarkGray Points 4740
  public static bool DoesPropertyExist(dynamic settings, string name)
  {
    if (settings is ExpandoObject)
      return ((IDictionary)settings).ContainsKey(name);

    return settings.GetType().GetProperty(name) != null;
  }

  var settings = new {Filename = @"c:\temp\q.txt"};
  Console.WriteLine(DoesPropertyExist(settings, "Filename"));
  Console.WriteLine(DoesPropertyExist(settings, "Size"));

Résultat :

 True
 False

6 votes

Cela ne fonctionne pas sur les objets dynamiques. Il renvoie toujours null.

0 votes

@evilom @Shikasta_Kashti Essayez-vous d'utiliser cette méthode avec un ViewBag MVC? Si c'est le cas, voir stackoverflow.com/a/24192518/70345

0 votes

@Gaspa79. Il s'agit d'une convention de codage pas si rare. Certains préfèrent ajouter le préfixe "Is" à toutes les propriétés booléennes. Une cohérence de ce genre peut vous éviter d'avoir à deviner les premiers caractères d'un identifiant (après quoi, Intellisense fonctionne), mais au détriment d'une certaine maladresse en anglais dans des cas comme celui-ci.

42voto

Sergey Points 968
public static bool HasProperty(dynamic obj, string name)
{
    Type objType = obj.GetType();

    if (objType == typeof(ExpandoObject))
    {
        return ((IDictionary)obj).ContainsKey(name);
    }

    return objType.GetProperty(name) != null;
}

1 votes

objType.GetProperty(name) != null; retourne null sur les propriétés qui existent effectivement

4 votes

objType.GetProperty(name) != null retournera toujours un bool, qui (par définition) ne peut jamais être null.

0 votes

@AlexMcMillan Je ne suis pas sûr dans quelle dimension vous vivez où Type.GetProperty(string) pour une propriété inexistante renvoie autre chose que null.

15voto

Mike Corcoran Points 5842

Si vous pouvez contrôler la création/passation de l'objet de paramètres, je recommande d'utiliser plutôt un ExpandoObject.

dynamic settings = new ExpandoObject();
settings.Filename = "asdf.txt";
settings.Size = 10;
...

function void Settings(dynamic settings)
{
    if ( ((IDictionary)settings).ContainsKey("Filename") )
        .... faire quelque chose ....
}

0 votes

Je ne peux pas le changer, puis-je le caster en ExpendoObject ?

13voto

Seth Reno Points 2221

Cela fonctionne pour les types anonymes, ExpandoObject, Nancy.DynamicDictionary ou tout autre objet pouvant être converti en IDictionary.

    public static bool PropertyExists(dynamic obj, string name) {
        if (obj == null) return false;
        if (obj is IDictionary dict) {
            return dict.ContainsKey(name);
        }
        return obj.GetType().GetProperty(name) != null;
    }

2 votes

Grande solution. J'avais besoin d'ajouter une autre déclaration IF lors de la conversion d'une chaîne JSON en JObject...."if (obj est Newtonsoft.Json.Linq.JObject) return ((Newtonsoft.Json.Linq.JObject)obj).ContainsKey(name);"

1 votes

A également fonctionné pour moi. Merveilleuse réponse Seth Reno. J'ai également ajouté "if (obj is Newtonsoft.Json.Linq.JObject) return ((Newtonsoft.Json.Linq.JObject)obj).ContainsKey(name);" dans la fonction ci-dessus comme suggéré par rr789. Veuillez également modifier votre réponse pour l'inclure.

1 votes

Merci @BrijeshKumarTripathi! C'était exactement mon scénario.

4voto

Bruno Marotta Points 158

Fusion et correction des réponses de Serj-TM et utilisateur3359453 afin que cela fonctionne avec à la fois ExpandoObject et DynamicJsonObject. Cela fonctionne pour moi.

public static bool HasPropertyExist(dynamic settings, string name)
{
    if (settings is System.Dynamic.ExpandoObject)
        return ((IDictionary)settings).ContainsKey(name);

    if (settings is System.Web.Helpers.DynamicJsonObject)
    try
    {
        return settings[name] != null;
    }
    catch (KeyNotFoundException)
    {
        return false;
    }

    return settings.GetType().GetProperty(name) != null;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X