Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试查找给定深度嵌套类/对象的属性名称_C#_List_Object_Nested_Getproperty - Fatal编程技术网

C# 尝试查找给定深度嵌套类/对象的属性名称

C# 尝试查找给定深度嵌套类/对象的属性名称,c#,list,object,nested,getproperty,C#,List,Object,Nested,Getproperty,我正在深入研究一个对象,它包含字符串格式的“值”,对应于嵌套在对象中的对象和属性,我从中获取这些值。也就是说,如果我的对象包含嵌套对象的列表,例如。。在联系人对象中,则我有一个“值”,可能会读作“ContactInfo[0].Name” 如何验证该属性是否存在?我很确定,如果我能弄清楚第一部分,那么我就可以轻松地获得值 我试着用了一些大致如下的方法: public static bool HasProperty(this object obj, string propertyName) {

我正在深入研究一个对象,它包含字符串格式的“值”,对应于嵌套在对象中的对象和属性,我从中获取这些值。也就是说,如果我的对象包含嵌套对象的列表,例如。。在联系人对象中,则我有一个“值”,可能会读作“ContactInfo[0].Name”

如何验证该属性是否存在?我很确定,如果我能弄清楚第一部分,那么我就可以轻松地获得值

我试着用了一些大致如下的方法:

public static bool HasProperty(this object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName) != null;
}
分别使用参数“MasterInfo”、“键[0].KeyWord”和“键[1].KeyWord”

我试着用点符号把它们分解成段和我能想到的所有东西,但我似乎无法成功地在方法中使用关键字。总是假的

我尝试通过一个例程运行MasterInfo对象,该例程将关键字分解为“.”,并对每个部分进行迭代,但结果没有变化。。。总是假的

新鲜的眼睛非常受欢迎!我必须错过一些简单的和/或就在我面前的东西

// simplified object example
public class MasterInfo
{
    public int Id { get; set; }

    public List<ContactInfo> Contacts {get; set;}

    public Message MessageDetail { get; set; }

    public List<Key> Keys { get; set; }
}

public class ContactInfo
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }
}

public class Message
{
    public int Id { get; set; }

    public string MessageContent { get; set; }
}

public class Key
{
    public int Id { get; set; }

    public string KeyWord { get; set; }
}



// serialized JSON of what the MasterInfo class would be populated with, easier to read than with '.' notation
{
    "Id" : 1,
    "Contacts" : [
        {
            "Id" : 1,
            "Name" : "Beavis",
            "Email" : "beavis@asd.asd"
        }
    ],
    "MessageDetail" : {
        "Id" : 23,
        "MessageContent" : "Hello, %%Contacts[0].Name%%, this was sent to you at %%Contacts[0].Email%%"
    },
    "Keys" : [
        {
            "Id" : 1,
            "KeyWord" : "Contacts[0].Name"
        },
        {
            "Id" : 2,
            "KeyWord" : "Contacts[0].Email"
        }
    ]
}



// method I'm trying to use to verify the keyword (property) exists before attempting to get it's value...
public static bool HasProperty(this object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName) != null;
}
//简化对象示例
公共类MasterInfo
{
公共int Id{get;set;}
公共列表联系人{get;set;}
公共消息MessageDetail{get;set;}
公共列表键{get;set;}
}
公共类联系人信息
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
}
公共类消息
{
公共int Id{get;set;}
公共字符串MessageContent{get;set;}
}
公开类密钥
{
公共int Id{get;set;}
公共字符串关键字{get;set;}
}
//MasterInfo类将填充的序列化JSON,比使用“.”符号更易于阅读
{
“Id”:1,
“联系人”:[
{
“Id”:1,
“姓名”:“比维斯”,
“电子邮件”:beavis@asd.asd"
}
],
“MessageDetail”:{
“Id”:23,
“MessageContent:“您好,%%联系人[0]。姓名%%,这是通过%%Contacts[0]发送给您的。电子邮件%%”
},
“钥匙”:[
{
“Id”:1,
“关键字”:“联系人[0]。姓名”
},
{
“Id”:2,
“关键字”:“联系人[0]。电子邮件”
}
]
}
//在尝试获取关键字(属性)的值之前,我尝试使用该方法验证关键字(属性)是否存在。。。
公共静态bool HasProperty(此对象对象对象,字符串propertyName)
{
返回obj.GetType().GetProperty(propertyName)!=null;
}

到目前为止,当评估时,所有结果都是错误的。我很确定这与我正在深入研究嵌套对象这一事实有关,但在这一点上我什么都不确定。

您的第一次尝试并不是很费力,因为您要解析的字符串不仅仅描述来自不同类型的一系列属性(反射一次只告诉您一种类型),但也包括对属性值的索引(这增加了整个其他层次的复杂性)。你需要遍历路径字符串,一次提取一个属性值。这就是我一直在逃避的,我已经尝试过了。我将在睡眠后更新一个示例(在经过大量修改和外部循环后,尝试在上面的内部递归,同时在每个级别调用上面的代码)。谢谢你的反馈!:p由于在遍历属性路径时不需要重新访问父对象,因此不需要递归。只是迭代。当你更新你的问题时,请确保它包括一个实际的问题。发布JSON要比发布包含解析JSON的代码的示例有用得多,或者只在代码中直接创建对象图。当然,它应该包括你实际最接近的努力,而不是一些保证不起作用的反思电话。另请参阅,以获取有关如何以清晰、可回答的方式表达问题的信息。
“ContactInfo[0].Name”
看起来像语法,因此您可以使用并通过。事实上,您是否可以在这里找到一个示例,以确定某些JSON(对应于对象和属性的字符串格式)是否包含指定的属性?@dbc感谢您的反馈。就这一点而言,我有点生疏。一旦上面的JSON被反序列化到MasterInfo对象中,我将如何引用列表中ContactInfo的第一个实例?与MasterInfo.Contacts[0].Name中一样,哪个应该生成“Beavis”?不过我可能会离开基地。不管怎样,谢谢你的建设性反馈!!非常感谢。我现在真的要睡觉了,但我会修改它以适应我真正的代码,并尝试一下。我会回来的!再次感谢!!!
    public static bool HasProperty(this object obj, params string[] properties)
    {
        return HasProperty(obj.GetType(), properties);
    }

    public static bool HasProperty(this Type type, params string[] properties)
    {
        if (properties.Length == 0) // if done properly, shouldn't need this
            return false;

        var propertyInfo = type.GetProperty(properties[0]);
        if (propertyInfo != null)
        {
            if (properties.Length == 1)
                return true;
            else // need to check the next level...
            {
                Type innerType = propertyInfo.PropertyType.GetGenericArguments().FirstOrDefault();
                if (innerType != null)
                    return HasProperty(innerType, properties.Skip(1).ToArray());
                else
                    return false;
            }
        }
        else
            return false;
    }

    public static void Testing()
    {
        MasterInfo masterInfo = new MasterInfo();
        Console.WriteLine(HasProperty(masterInfo, "Id")); // true
        Console.WriteLine(HasProperty(masterInfo, "Contacts", "Name")); // true
        Console.WriteLine(HasProperty(masterInfo, "Contacts", "Address")); // false
    }