get value of a property by its path in asp.net

2019-07-14 05:23发布

here a solution is given to get value of a property of a class by supplying its name . now I wonder how I can do the same in this condition :

I have a class MyClass . this class ha a property of type Foo named foo . the Foo has a property of type Bar named bar . and bar has a string property named value .

properties are not static .

I want to be able to get value of foo.bar.value by passing the string "foo.bar.value" as propertyName . in other word I want to pass the property path to get its value .

is it possible ?

4条回答
叛逆
2楼-- · 2019-07-14 05:55

As You pointing to answer of the question here , You need to make use of Reglection to achieve same thing.

With help of reflection you can read value of property.

something like this,

// dynamically load assembly from file Test.dll
Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");
// get type of class Calculator from just loaded assembly
Type calcType = testAssembly.GetType("Test.Calculator");
// create instance of class Calculator
object calcInstance = Activator.CreateInstance(calcType);
// get info about property: public double Number
PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");
// get value of property: public double Number
double value = (double)numberPropertyInfo.GetValue(calcInstance, null);

you need a put the code in one function and than split string as per you requirement

public object getvalue(string propname)
{
  //above code with return type object 
}
String[] array = string.Split("foo.bar.value");
//call above method to get value of property..

Read for detail : http://www.csharp-examples.net/reflection-examples/

查看更多
迷人小祖宗
3楼-- · 2019-07-14 06:02

You can do this with a recursive method. Each call takes the value with the first word in path and call the method again with the rest of the part.

public object GetPropertyValue(object o, string path)
{
    var propertyNames = path.Split('.');
    var value = o.GetType().GetProperty(propertyNames[0]).GetValue(o, null);

    if (propertyNames.Length == 1 || value == null)
        return value;
    else
    {
        return GetPropertyValue(value, path.Replace(propertyNames[0] + ".", ""));
    }
}
查看更多
倾城 Initia
4楼-- · 2019-07-14 06:06

Assuming FOO is static, you can get the class from a string like this:

C# Reflection: How to get class reference from string?

...and then use the rest of the post you've linked to to get the property and value from there:

Get property Value by its stringy name

If FOO isn't static, you'll need to use reflection on the instance (which would negate the requirement to pass in the name of the class as a string, since you can get the class from the instance with GetType()) - remembering that Bar won't have a value in the class unless it is static.

查看更多
做个烂人
5楼-- · 2019-07-14 06:12

This assumes that the properties are named like the classes. i.e. that the property of Type Foo is also named Foo. Without this assumption, the question is lacking some crucial information.

You can use the string.Split method to separate the string foo.bar.value at the dots. You will then have an array with one element per property name.

Iterate over that array and use PropertyInfo.GetValue to retrieve the value of the properties. The value returned in one operation is the instance passed to GetValue in the following iteration.

string props = "foo.bar.value";
object currentObject = // your MyClass instance

string[] propertyChain = props.Split('.');
foreach (string propertyName in propertyChain) {
    if (propertyName == "") {
        break;
    }

    PropertyInfo prop = currentObject.GetType().GetProperty(propertyName);
    currentObject = prop.GetValue(currentObject);
    if (currentObject == null) {
        // somehow handle the situation that one of the properties is null
    }
}

Update: I have added a safeguard to ensure this will work even if props is empty. In that case, currentObject will remain a reference to the original MyClass instance.

查看更多
登录 后发表回答