在C#中使用Reflection从String生成整个属性调用

时间:2013-12-04 11:28:59

标签: c# asp.net-mvc reflection

我知道我可以使用C#反射来查找使用对象的字符串(例如“Property1”)的属性。

我需要做的是使用字符串生成整个调用。例如“Object1.Object2.Property”。

我怎样才能在C#中做到这一点?

如果我不能使用反射,我可以使用什么?

仅供参考我在ASP.NET中使用它来使用绑定到模型中该属性的表单字段的名称来访问模型属性。如果有人知道另一种方法,请提出建议。

由于

2 个答案:

答案 0 :(得分:0)

包括论文名称空间:

using System.Reflection;
using System.Linq;

尝试这样的事情:

public string ReadProperty(object object1)
{
    var object2Property = object1.GetType().GetProperties().FirstOrDefault(x => x.Name == "Object2");
    if (object2Property != null)
    {
        var anyProperty = object2Property.GetType().GetProperties().FirstOrDefault(x => x.Name == "Property");
        if (anyProperty != null)
        {
            var object2Value = object2Property.GetValue(object1, null);

            if (object2Value != null)
            {
                var valueProperty = anyProperty.GetValue(object2Value, null);

                return valueProperty;
            }
        }
    }

    return null;
}

只需替换正确属性的属性名称。

答案 1 :(得分:0)

这是一个使用指定字符串获取属性值的工作代码:

static object GetPropertyValue(object obj, string propertyPath)
{
    System.Reflection.PropertyInfo result = null;
    string[] pathSteps = propertyPath.Split('/');
    object currentObj = obj;
    for (int i = 0; i < pathSteps.Length; ++i)
    {
        Type currentType = currentObj.GetType();
        string currentPathStep = pathSteps[i];
        var currentPathStepMatches = Regex.Match(currentPathStep, @"(\w+)(?:\[(\d+)\])?");
        result = currentType.GetProperty(currentPathStepMatches.Groups[1].Value);
        if (result.PropertyType.IsArray)
        {
            int index = int.Parse(currentPathStepMatches.Groups[2].Value);
            currentObj = (result.GetValue(currentObj) as Array).GetValue(index);
        }
        else
        {
            currentObj = result.GetValue(currentObj);
        }

    }
    return currentObj;
}

然后您可以获取值查询,包括数组,例如:

var v = GetPropertyValue(someClass, "ArrayField1[5]/SomeField");