проверьте, существует ли свойство в классе C # Expando

Я хотел бы узнать, существует ли свойство в классе C # Expando.

очень похоже на hasattr функция в питоне. Я бы хотел, чтобы для hasattr был эквивалент C #.

что-то вроде этого...

if (HasAttr(model, "Id"))
{
  # Do something with model.Id
}

person eiu165    schedule 20.08.2012    source источник
comment
возможный дубликат Как определить, существует ли свойство на ExpandoObject?   -  person nawfal    schedule 20.07.2014


Ответы (2)


Пытаться:

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

ExpandoObject явно реализует IDictionary<string, Object>, где Key - это имя свойства. Затем вы можете проверить, содержит ли словарь ключ. Вы также можете написать небольшой вспомогательный метод, если вам нужно часто делать такую ​​проверку:

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

И используйте это так:

if (HasAttr(yourExpando, "Id"))
{
    //Has property...
}
person vcsjones    schedule 20.08.2012

Согласно ответу vcsjones, будет еще приятнее:

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

а потом:

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

var result = expando.HasAttr("Name");
person MRFerocius    schedule 13.04.2013
comment
Возможно, было бы неплохо, но C # не допускает использования метода расширения для динамического объекта. См. [stackoverflow.com/questions/12501773/. - person Martin_W; 17.05.2013
comment
А как насчет добавления динамического метода с именем HasAttr к объекту expando? Примерно так: expando.HasAttr = new Func ‹bool› ((string key) = ›((IDictionary‹ string, Object ›) expando) .ContainsKey (key)); - person ZunTzu; 04.06.2013