读取模型属性,其中模型作为匿名对象传递 - C#

Read model properties where model is passed as an Anonymous object - C#

提问人:Rumpo 提问时间:8/1/2023 最后编辑:Rumpo 更新时间:8/1/2023 访问量:45

问:

我正在使用一个方法,该方法采用匿名对象和字符串,然后将字符串与对象属性名称进行比较。

在此示例中,对象是包含基本属性和自定义类属性的模型:

型:

class MyClass
{
    public string Name { get; set; }
    public AddressClass Address { get; set; }
}

public class AddressClass
{
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
}

方法(正在传递 MyClass 模型):

protected string GetPropertyName(object model, string propertyName)
    {
        var propertyInfo = model.GetType().GetProperties().FirstOrDefault(pi => pi.Name == propertyName);

        return propertyInfo;
    }

此代码正在工作并返回“Name”,其中字符串等于“Name”。但是,当字符串等于这些值时,不适用于“AddressLine1”或“AddressLine2”属性。相反,它返回 Null。

在此示例中,是否可以在不指定方法中指定模型类型的情况下访问模型对象内部以比较字符串?

谢谢

C# 模型 匿名对象

评论

1赞 Ralf 8/1/2023
您的意思是您为该方法提供了一个 MyClass 实例并要求在 AddressClass 类中提供属性名?
0赞 Rumpo 8/1/2023
嗨,拉尔夫 - 是的,没错。我将编辑以明确这一点。
0赞 Guru Stron 8/1/2023
无法复制
0赞 Rand Random 8/1/2023
@GuruStron - 您传递了 AddressClass 的实例而不是 MyClass - OP 正在寻找一种搜索嵌套对象的方法
0赞 Guru Stron 8/1/2023
@RandRandom 我明白 =)

答:

0赞 Kasper Laursen 8/1/2023 #1

我有点困惑你需要这个做什么。拥有属性名称和未知模型似乎很奇怪。

在任何情况下,您都可以循环访问属性及其属性。 我已经在下面使用递归完成了它。 如果你需要属性的价值,你需要改变一些东西。

protected string GetPropertyName(object model, string propertyName)
{
    var propInfo = model as PropertyInfo;
    var props = propInfo != null ? propInfo.PropertyType.GetProperties() : model.GetType().GetProperties();
    foreach (var prop in props)
    {
        if (prop.Name == propertyName)
            return prop.Name;

        var subProb = GetPropertyName(prop, propertyName);
        if (subProb != null)
            return subProb;
    }

    return null;
}

评论

0赞 Rand Random 8/1/2023
注意:在我的解决方案(在评论中)中,如果您有此设置,我添加了对类型 () 的检查以防止堆栈溢出: dotnetfiddle.net/pexSjd - 这里不是问题:dotnetfiddle.net/uPE1i5if (type == typeof(MyClass) && pi.PropertyType == typeof(AddressClass))