Как проверить, существует ли свойство для динамического анонимного типа в c#?
У меня есть анонимный тип объекта, который я получаю в качестве динамического метода
Я хотел бы проверить, что свойство существует на этом объекте.
....
var settings = new {
Filename="temp.txt",
Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
Как бы я реализовал IsSettingExist ?
8 ответов:
public static bool IsPropertyExist(dynamic settings, string name) { if (settings is ExpandoObject) return ((IDictionary<string, object>)settings).ContainsKey(name); return settings.GetType().GetProperty(name) != null; } var settings = new {Filename = @"c:\temp\q.txt"}; Console.WriteLine(IsPropertyExist(settings, "Filename")); Console.WriteLine(IsPropertyExist(settings, "Size"));выход:
True False
public static bool HasProperty(dynamic obj, string name) { Type objType = obj.GetType(); if (objType == typeof(ExpandoObject)) { return ((IDictionary<string, object>)obj).ContainsKey(name); } return objType.GetProperty(name) != null; }
Если вы можете управлять созданием / передачей объекта настроек, я бы рекомендовал вместо этого использовать ExpandoObject.
dynamic settings = new ExpandoObject(); settings.Filename = "asdf.txt"; settings.Size = 10; ... function void Settings(dynamic settings) { if ( ((IDictionary<string, object>)settings).ContainsKey("Filename") ) .... do something .... }
это работает для меня:
public static bool IsPropertyExist(dynamic dynamicObj, string property) { try { var value=dynamicObj[property].Value; return true; } catch (RuntimeBinderException) { return false; } }
используя отражение, это функция, которую я использую:
public static bool doesPropertyExist(dynamic obj, string property) { return ((Type)obj.GetType()).GetProperties().Where(p => p.Name.Equals(property)).Any(); }затем..
if (doesPropertyExist(myDynamicObject, "myProperty")){ // ... }
слияние и исправление ответов от Serj-TM и user3359453, чтобы он работал как с ExpandoObject, так и с DynamicJsonObject. Это работает для меня.
public static bool HasPropertyExist(dynamic settings, string name) { if (settings is System.Dynamic.ExpandoObject) return ((IDictionary<string, object>)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; }
ни одно из решений выше не работало для
dynamicэто происходит отJson, однако, мне удалось превратить один сTry catch(по @user3359453) путем изменения типа исключения (KeyNotFoundExceptionвместоRuntimeBinderException) в то, что на самом деле работает...public static bool HasProperty(dynamic obj, string name) { try { var value = obj[name]; return true; } catch (KeyNotFoundException) { return false; } }надеюсь, что это экономит ваше время.
это работает для анонимных типов,
ExpandoObject,Nancy.DynamicDictionaryили что-нибудь еще, что может быть приведен кIDictionary<string, object>.public static bool PropertyExists(dynamic obj, string name) { if (obj == null) return false; if (obj is IDictionary<string, object> dict) { return dict.ContainsKey(name); } return obj.GetType().GetProperty(name) != null; }

Comments