[C#] C #의 동적 익명 형식에 속성이 있는지 어떻게 확인합니까?

해당 개체에 속성이 있는지 확인하려는 메서드에서 동적으로받는 익명 형식 개체가 있습니다.

....
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 ....
}


답변

익명 형식에 대해이 작품 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;
    }


답변

이것은 나를 위해 일하고 있습니다-:

  public static bool IsPropertyExist(dynamic dynamicObj, string property)
       {
           try
           {
               var value=dynamicObj[property].Value;
               return true;
           }
           catch (RuntimeBinderException)
           {

               return false;
           }

       }


답변

근무 위의 솔루션 중 어느 것도 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 및 DynamicJsonObject 모두에서 작동하도록 Serj-TM 및 user3359453의 답변을 병합하고 수정합니다. 이것은 나를 위해 작동합니다.

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;
}