netDeveloperUK
netDeveloperUK

Reputation: 39

How to access properties by name?

This is a simple example on how I update a value in the database:

var context = new dbEntities();
var car = context.CarTable.Where(p => p.id == id).FirstOrDefault();
car.Make = "Volvo";
context.SaveChanges();

However, what I need to do now is to get the property by name instead. So this is what I in theory would like to do:

var context = new dbEntities();
var car = context.CarTable.Where(p => p.id == id).FirstOrDefault();
**car["Make"] = "Volvo";**
context.SaveChanges();

Is this possible in EF?

Upvotes: 0

Views: 185

Answers (3)

Avram Tudor
Avram Tudor

Reputation: 1526

public class Car
{
    public string Make { get; set; }

    public object this[string name]
    {
        get
        {
            var property = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(name));

            if (property != null)
            {
                return property.GetValue(this, null);
            }

            return null;
        }
        set
        {
            var property = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(name));

            if (property != null)
            {
                property.SetValue(this, value, null);
            }
        }
    }
}

Upvotes: 0

arctangent
arctangent

Reputation: 1

The main question is really why do you need this?

The best way is still car.Make = "Volvo";.

If string-name is strongly needed, you can use Reflection:

var property = typeof (Car).GetProperty("Make");
property.SetValue(car, "BMW", null);

Here are 2 drawbacks:

  • Slow.
  • Compiler cannot check the string.

The other way - you can use indexer and switch:

 public class Car
    {
        public string Make { get; set; }

        public string this[String name]
        {
            set
            {
                switch (name)
                {
                    case "Make":
                        Make = value;
                        break;
                    ...
                }
            }
        }
    }

And then just car["Make"] = "Volvo"; It's faster, but a typ-problem occurs: you have to parse strings or operate with objects.

Upvotes: 0

Maarten
Maarten

Reputation: 22945

I wouldn't use reflection since that would be slow.

You can use expression trees, especially if you cache the expressions. Check this link for an article about it. I would write a wrapper around the code in the article which takes an object and a propertyname (string), creates/caches the func using the code in the article (or retrieves it from the cache), and executes the func.

Upvotes: 2

Related Questions