繁体   English   中英

无法通过反射获得动态属性

[英]Not able to get dynamic properties with reflection

动态对象是使用我正在使用的Json反序列化组件( Jil )生成的,并且能够直接访问属性。 但是我事先不知道他们的名字,所以我试图通过反思来获得这些名字。 我尝试这样做:

var props = myDynObj.GetType().GetProperties();

但页面超时。 在调试器中没有给我任何东西,只是坐在那里什么都不做,或者什么都不告诉我。

当我什至这样做时,甚至会发生这种情况:

var t = myDynObj.GetType();

但是,当我这样做时,它会起作用:

var val = myDynObj.MyStaticValue1

只是真的不能做任何其他事情。 Anyonw知道原因,以及如何使它起作用?

请允许我注意:

在开始之前,如果您在解析JSON时不了解成员,则不应将其解析为动态对象。 内置的.Net JavaScriptConverter类可以将JSON解析为IDictionary<string, object> ,这对您来说会更好。

但是,如果由于某些原因仍要使用动态对象,则:

如果您想坚持使用当前的库:我不知道该类的工作原理,并不是说这是最好的解决方案,但是通过查看源代码,它跳到我的头上,您可以获取一个列表。使用反射的ObjectMembers键。

Type t = typeof(JsonObject)
var fi = t.GetField("ObjectMembers", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
IEnumerable<string> keys = ((Dictionary<string, JsonObject>)fi.GetValue(obj)).Keys;


编辑:看到JsonObject实现IDynamicMetaObjectProvider,此问题中提到的以下方法也可以在其上工作:

public static IEnumerable<string> GetMemberNames(object target, bool dynamicOnly = false)
{
    var tList = new List<string>();
    if (!dynamicOnly)
    {
       tList.AddRange(target.GetType().GetProperties().Select(it => it.Name));
    }

    var tTarget = target as IDynamicMetaObjectProvider;
    if (tTarget !=null)
    {
        tList.AddRange(tTarget.GetMetaObject(Expression.Constant(tTarget)).GetDynamicMemberNames());
    }else
    {

        if (ComObjectType != null && ComObjectType.IsInstanceOfType(target) && ComBinder.IsAvailable)
        {
            tList.AddRange(ComBinder.GetDynamicDataMemberNames(target));
        }
    }
    return tList;
} 



如果您愿意尝试使用其他JSON转换器:请在此处尝试此类: http : //pastie.org/private/vhwfvz0pg06zmjqirtlxa我不确定我在哪里找到它(我不能相信),但这是一个示例如何使用它,你想如何:

// Create dynamic object from JSON string
dynamic obj = DynamicJsonConverter.CreateSerializer().Deserialize("JSON STRING", typeof(object));
// Get json value
string str = obj.someValue;
// Get list of members
IEnumerable<string> members = (IDictionary<string, object>)obj).Keys

我个人喜欢使用第二个,它简单易用-内置了.Net JSON解析器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM