반응형
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 ....
}
이것은 나를 위해 일하고 있습니다 :
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
나는 그러나 하나의 변형 관리, Try catch
(던져 예외 유형 변경 (@ user3359453에 의해)을 KeyNotFoundException
대신 RuntimeBinderException
하는 것이 실제로 작동 뭔가를) ...
public static bool HasProperty(dynamic obj, string name)
{
try
{
var value = obj[name];
return true;
}
catch (KeyNotFoundException)
{
return false;
}
}
Hope this saves you some time.
This works for anonymous types, ExpandoObject
, Nancy.DynamicDictionary
or anything else that can be cast to 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;
}
반응형
'program story' 카테고리의 다른 글
Golang에서 정수를 부동 수로 변환 (0) | 2020.08.04 |
---|---|
C ++ 템플릿 생성자 (0) | 2020.08.04 |
Chrome net :: ERR_INCOMPLETE_CHUNKED_ENCODING 오류 (0) | 2020.08.04 |
Java 스트림에서 실제로는 디버깅을 위해서만 엿볼 수 있습니까? (0) | 2020.08.04 |
XML, HTML 및 XHTML 문서에 유효한 컨텐츠 유형 (0) | 2020.08.04 |