10

I would like to see if a property exist in a C# Expando Class.

much like the hasattr function in python. I would like the c# equalant for hasattr.

something like this...

if (HasAttr(model, "Id"))
{
  # Do something with model.Id
}
Community
  • 1
  • 1
eiu165
  • 6,101
  • 10
  • 41
  • 59
  • possible duplicate of [How to detect if a property exists on an ExpandoObject?](http://stackoverflow.com/questions/2839598/how-to-detect-if-a-property-exists-on-an-expandoobject) – nawfal Jul 19 '14 at 21:00

2 Answers2

24

Try:

dynamic yourExpando = new ExpandoObject();
if (((IDictionary<string, Object>)yourExpando).ContainsKey("Id"))
{
    //Has property...
}

An ExpandoObject explicitly implements IDictionary<string, Object>, where the Key is a property name. You can then check to see if the dictionary contains the key. You can also write a little helper method if you need to do this kind of check often:

private static bool HasAttr(ExpandoObject expando, string key)
{
    return ((IDictionary<string, Object>) expando).ContainsKey(key);
}

And use it like so:

if (HasAttr(yourExpando, "Id"))
{
    //Has property...
}
vcsjones
  • 138,677
  • 31
  • 291
  • 286
0

According to vcsjones answer it will be even nicer to:

private static bool HasAttr(this ExpandoObject expando, string key)
{
    return ((IDictionary<string, Object>) expando).ContainsKey(key);
}

and then:

dynamic expando = new ExpandoObject();
expando.Name = "Test";

var result = expando.HasAttr("Name");
MRFerocius
  • 5,509
  • 7
  • 39
  • 47
  • 2
    It would perhaps be nice, but C# won't allow an extension method on a dynamic object. See [http://stackoverflow.com/questions/12501773/how-to-apply-an-extension-method-on-the-object-having-the-type-of-expandoobject]. – Martin_W May 16 '13 at 20:42
  • 1
    What about adding a dynamic method named HasAttr to the expando object? Something like this: expando.HasAttr = new Func((string key) => ((IDictionary) expando).ContainsKey(key)); – ZunTzu Jun 04 '13 at 13:08