首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过字符串从C#动态对象获取属性值(反射?)

通过字符串从C#动态对象获取属性值(反射?)
EN

Stack Overflow用户
提问于 2011-12-26 04:59:32
回答 8查看 236K关注 0票数 82

假设我有一个动态变量:

dynamic d = *something*

现在,我从字符串数组中为d创建属性:

string[] strarray = { 'property1','property2',..... }

我事先不知道房产的名字。

在代码中,一旦创建了d并从DB中拉出了strarray,我可以获得这些值吗?

我要去找d.property1 , d.property2

我看到该对象有一个包含键和值的_dictionary内部字典,如何检索它们?

EN

回答 8

Stack Overflow用户

发布于 2011-12-26 09:19:37

这将为您提供动态变量中定义的所有属性名称和值。

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);
}
票数 34
EN

Stack Overflow用户

发布于 2012-12-23 22:19:28

希望这能对你有所帮助:

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);
    }
}
票数 27
EN

Stack Overflow用户

发布于 2018-04-12 17:33:45

使用下面的代码获取动态对象属性的名称和值。

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
 }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8631546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档