Dav*_* MZ 112 c# reflection dynamic .net-4.0 c#-4.0
我有一个匿名类型对象,我从一个方法接收动态,我想检查该对象上存在的属性.
....
var settings = new {
                   Filename="temp.txt",
                   Size=10
}
...
function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}
我该如何实现IsSettingExist?
Ser*_*-Tm 128
  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
Ser*_*gey 34
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;
}
Mik*_*ran 13
如果你可以控制创建/传递设置对象,我建议使用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 ....
}
Set*_*eno 12
这适用于匿名类型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;
    }
Osc*_*nez 10
我遇到的动态是Newtonsoft.Json.Linq.JObject而不是IDictionary
我添加了额外的 if 并且它有效。
public static bool PropertyExists(dynamic obj, string name)
{
    if (obj == null) return false;
    else if (obj is IDictionary<string, object> dict)
    {
        return dict.ContainsKey(name);
    }
    else if (obj is Newtonsoft.Json.Linq.JObject jObject)
    {
        return jObject.ContainsKey(name);
    }
    else
    {
        return obj.GetType().GetProperty(name) != null;
    }
}
使用 switch 表达式编辑比以前更智能的解决方案
public static bool PropertyExists(dynamic obj, string name)
{
    if (obj == null) return false;
    return obj switch
    {
        IDictionary<string, object> dict => dict.ContainsKey(name),
        Newtonsoft.Json.Linq.JObject jObject => jObject.ContainsKey(name),
        _ => obj.GetType().GetProperty(name) != null
    };
}
如果有人需要处理来自 Json 的动态对象,我修改了 Seth Reno 答案来处理从 NewtonSoft.Json.JObjcet 反序列化的动态对象。
public static bool PropertyExists(dynamic obj, string name)
    {
        if (obj == null) return false;
        if (obj is ExpandoObject)
            return ((IDictionary<string, object>)obj).ContainsKey(name);
        if (obj is IDictionary<string, object> dict1)
            return dict1.ContainsKey(name);
        if (obj is IDictionary<string, JToken> dict2)
            return dict2.ContainsKey(name);
        return obj.GetType().GetProperty(name) != null;
    }
合并并修复 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;
}
| 归档时间: | 
 | 
| 查看次数: | 91185 次 | 
| 最近记录: |