K # 동적 개체에서 속성 값 가져 오기 (반사?)
동적 변수가 많은 가정합니다.
dynamic d = *something*
이제 뭔가d
확장 배열에서 내가 가진 속성을 만듭니다 .
string[] strarray = { 'property1','property2',..... }
사전에 부동산 이름을 확인하세요.
코드에서 일단 d
생성되고 DB에서 strarray를 가져 오면 값을 가질 수 있습니까?
나는하고 싶다 d.property1 , d.property2
.
객체 _dictionary
에 키와 값이 포함 된 내부 사전 이있는 것을 확인했습니다. 어떻게 검색합니까?
동적으로 생성 된 객체를 사용하는 더 우아한 방법이 있는지 모르겠지만 평범한 오래된 사용하면 효과가 있습니다.
var nameOfProperty = "property1";
var propertyInfo = myObject.GetType().GetProperty(nameOfProperty);
var value = propertyInfo.GetValue(myObject, null);
GetProperty
null
유형 myObject
에이 이름의 공용 속성이 포함되지 않은 경우 반환 됩니다 .
편집 : "일반"개체가 아니라 구현하는 IDynamicMetaObjectProvider
경우이 방법은 작동하지 않습니다. 대신이 질문을 사용 :
그러면 동적 변수에 정의 된 모든 속성 이름과 값이 제공됩니다.
dynamic d = { // your code };
object o = d;
string[] propertyNames = o.GetType().GetProperties().Select(p => p.Name).ToArray();
foreach (var prop in propertyNames)
{
object propValue = o.GetType().GetProperty(prop).GetValue(o, null);
}
이것이 도움이되기를 바랍니다.
public static object GetProperty(object o, string member)
{
if(o == null) throw new ArgumentNullException("o");
if(member == null) throw new ArgumentNullException("member");
Type scope = o.GetType();
IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider;
if(provider != null)
{
ParameterExpression param = Expression.Parameter(typeof(object));
DynamicMetaObject mobj = provider.GetMetaObject(param);
GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[]{CSharpArgumentInfo.Create(0, null)});
DynamicMetaObject ret = mobj.BindGetMember(binder);
BlockExpression final = Expression.Block(
Expression.Label(CallSiteBinder.UpdateLabel),
ret.Expression
);
LambdaExpression lambda = Expression.Lambda(final, param);
Delegate del = lambda.Compile();
return del.DynamicInvoke(o);
}else{
return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null);
}
}
string json = w.JSON;
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
DynamicJsonConverter.DynamicJsonObject obj =
(DynamicJsonConverter.DynamicJsonObject)serializer.Deserialize(json, typeof(object));
이제 obj._Dictionary
사전이 포함되어 있습니다. 완전 완전!
이 코드는 JSON을 C # 동적 개체로 Deserialize? 와 함께 있어야 합니다. + _dictionary 변수를 "private readonly"코드에서 public으로 만듭니다.
ExpandoObject 클래스를 보거나 ?
MSDN 에서 직접 설명 : "구성원이 실행에 동적으로 추가 및 제거 될 수있는 개체를 나타냅니다."
이를 통해 다음과 같은 코드를 작성할 수 있습니다.
dynamic employee = new ExpandoObject();
employee.Name = "John Smith";
((IDictionary<String, Object>)employee).Remove("Name");
Newtonsoft에서 d가 생성 된 경우이를 사용하여 속성 이름과 값을 읽을 수 있습니다.
foreach (JProperty property in d)
{
DoSomething(property.Name, property.Value);
}
다음 코드를 사용하여 동적 개체 속성의 이름과 값을 가져옵니다.
dynamic d = new { Property1= "Value1", Property2= "Value2"};
var properties = d.GetType().GetProperties();
foreach (var property in properties)
{
var PropertyName=property.Name;
//You get "Property1" as a result
var PropetyValue=d.GetType().GetProperty(property.Name).GetValue(d, null);
//You get "Value1" as a result
// you can use the PropertyName and Value here
}
" dynamicObject.PropertyName.Value
"를 사용 하여 동적 속성의 값을 직접 가져올 수 있습니다.
예 :
d.property11.Value
이것이 미래에 누군가에게 도움이 될 것이라고 생각했습니다.
이미 속성 이름을 알고 있다면 다음과 같이 할 수 있습니다.
[HttpPost]
[Route("myRoute")]
public object SomeApiControllerMethod([FromBody] dynamic args){
var stringValue = args.MyPropertyName.ToString();
//do something with the string value. If this is an int, we can int.Parse it, or if it's a string, we can just use it directly.
//some more code here....
return stringValue;
}
다음과 같이 시도해 볼 수 있습니까?
d?.property1 , d?.property2
.netcore 2.1을 테스트하고 작업했습니다.
'ProgramingTip' 카테고리의 다른 글
서블릿에 대한 요청이 HTTP 또는 HTTPS를 사용하여 실행 어떻게 알 수 있습니까? (0) | 2020.11.14 |
---|---|
Liquid 마크 업으로 오늘 날짜를 Jekyll에서 확인하세요 (0) | 2020.11.14 |
'double'을 입력하도록 목록 생성을 강제하는 방법 (0) | 2020.11.13 |
두 목록의 결합을 형성하는 가장 간단한 방법 (0) | 2020.11.13 |
T-SQL 및 WHERE LIKE % 매개 변수 % 절 (0) | 2020.11.13 |