私は、そのオブジェクトに存在するプロパティをチェックインしたいメソッドからダイナミックとして受け取る匿名型オブジェクトを持っています。
....
var settings = new {
Filename="temp.txt",
Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
IsSettingExistはどのように実装しますか?
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;
}
}
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;
}
反射を使用して、これは私が使用する関数です:
public static bool doesPropertyExist(dynamic obj, string property)
{
return ((Type)obj.GetType()).GetProperties().Where(p => p.Name.Equals(property)).Any();
}
その後..
if (doesPropertyExist(myDynamicObject, "myProperty")){
// ...
}
上記のソリューションはいずれもdynamic
に由来するJson
には機能しませんでしたが、スローされる例外タイプ(KeyNotFoundException
の代わりにRuntimeBinderException
を変更することにより、Try catch
] _)実際に機能するものに...
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;
}