C# accessing property values dynamically by property name

30,374

Solution 1

public static object ReflectPropertyValue(object source, string property)
{
     return source.GetType().GetProperty(property).GetValue(source, null);
}

Solution 2

You're going way overboard with the samples you provide.

The method you're looking for:

public static object GetPropValue( object target, string propName )
 {
     return target.GetType().GetProperty( propName ).GetValue(target, null);
 }

But using "var" and "dynamic" and "Expression" and "Lambda"... you're bound to get lost in this code 6 months from now. Stick to simpler ways of writing it

Share:
30,374
Thewads
Author by

Thewads

#SOreadytohelp

Updated on July 09, 2022

Comments

  • Thewads
    Thewads almost 2 years

    The problem I am trying to solve is how to write a method which takes in a property name as a string, and returns the value assigned to said property.

    My model class is declared similar to:

    public class Foo
    {
        public int FooId
        public int param1
        public double param2
    }
    

    and from within my method I wish to do something similar to this

    var property = GetProperty("param1)
    var property2 = GetProperty("param2")
    

    I am currently trying to do this by using Expressions such as

    public dynamic GetProperty(string _propertyName)
        {
            var currentVariables = m_context.Foo.OrderByDescending(x => x.FooId).FirstOrDefault();
    
            var parameter = Expression.Parameter(typeof(Foo), "Foo");
            var property = Expression.Property(parameter, _propertyName);
    
            var lambda = Expression.Lambda<Func<GlobalVariableSet, bool>>(parameter);
    
        }
    

    Is this approach correct, and if so, is it possible to return this as a dynamic type?

    Answers were correct, was making this far too complex. Solution is now:

    public dynamic GetProperty(string _propertyName)
    {
        var currentVariables = m_context.Foo.OrderByDescending(g => g.FooId).FirstOrDefault();
    
        return currentVariables.GetType().GetProperty(_propertyName).GetValue(currentVariables, null);
    }
    
  • Phil Gan
    Phil Gan over 11 years
    I think this will throw an exception for properties that have an indexer.