Solved

C# - Get value of property from an object dynamically

Posted on 2012-03-10
7
364 Views
Last Modified: 2012-06-27
Hi

I have a class called "shipment" that contains a lot of properties, such as Address1, Address2, Address3, PostCode, OrderNumber etc etc etc. This object gets passed to a web service, it creates the orders, then it sends an email. However, I want to make the email dynamic. For instance: for customer A, I might want to show Address1 and Address2, Customer B might want to show OrderNumber and Post Code

What I want to do, is have a database table that is called, and then says which properties of the object need to go onto the email. I think I need to use reflection, but I don't really understand it

So, in the db table will be a value of shipment.Address1 and shipment.Address2 which will be pulled out as strings, that then needs converting to take the value of the actual shipment.Address1 and 2

Does this make sense ? Hopefully have explained myself ok !

Thanks in advance
0
Comment
Question by:seancurt
  • 4
  • 3
7 Comments
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 total points
ID: 37705110
This example shows how to get both a public field and a public property:
    public class shipment
    {

        public string Address1;

        private string _Address2;
        public string Address2
        {
            get { return _Address2; }
            set { _Address2 = value;  }
        }

    }

Open in new window


            shipment s = new shipment();
            s.Address1 = "Hello";
            s.Address2 = "World";

            string field = "Address1";
            System.Reflection.FieldInfo fi = s.GetType().GetField(field, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
            if (fi != null)
            {
                string value = fi.GetValue(s).ToString();
                MessageBox.Show(field + " = " + value);
            }

            string propName = "Address2";
            System.Reflection.PropertyInfo pi = s.GetType().GetProperty(propName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
            if (pi != null)
            {
                string value = pi.GetValue(s, null).ToString();
                MessageBox.Show(propName + " = " + value);
            }

Open in new window

0
 

Author Comment

by:seancurt
ID: 37705583
perfect - thank you so much
0
 

Author Comment

by:seancurt
ID: 37707593
Hi

I need to develop this a little more (will open a new question if you wish)

I have used your code as follows:

                                string propName = field;
                                System.Reflection.PropertyInfo pi = order.Header.GetType().GetProperty(propName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
                                if (pi != null)
                                {
                                    string value = pi.GetValue(order.Header, null).ToString();
                                    //Console.WriteLine(propName + " = " + value);
                                    strEmailLine += value + "~";
                                }

Open in new window



I have the code inside a loop:

            foreach (Order order1 in file.Orders)

and then using some code I used before, I tried

Type type = Type.GetType("order1.Header"); - but this resolves to null

If I tried and use the full path Integration.Types.Order then it works, but this won't relate specifically to the instance of ORder1 inside the loop

Does this make sense ?

Thanks
0
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 37707596
Are you trying to get the type of "order1", or "Header"?

At any rate, use GetType() against that specific member like this:

    Type type = order1.GetType();

or this:

    Type type = order1.Header.GetType();
0
 

Author Comment

by:seancurt
ID: 37710045
Hi

Am trying to get it for both. The problem is that I need to do it dynamically, so order1 or order1.Header will actually be a string value. If I do the below, type is null, which implies it can't find order1.Header when passed as a string

            foreach (Order order1 in file.Orders)
            {

                string propName = "SHIPMENT_ID";
                Type type = Type.GetType("Order1.Header");
                System.Reflection.PropertyInfo pi = type.GetType().GetProperty(propName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
                if (pi != null)
                {
                    string value = pi.GetValue(order.Header, null).ToString();
                    Console.WriteLine(value);
                }


            }

Open in new window

0
 

Author Comment

by:seancurt
ID: 37710058
Hi

In the above example, where i have done Type.GetType("Order1.Header") - this is a mistake, it should be all lower case, and that still doesn't work

Scott
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 37710502
Is "Header" an actual TYPE (class/structure), or is it simply the name of a field/property?

I'm thinking the latter.  If this is the case then you'd have to PARSE your string to separate into the Type portion and the FIELD portion.  To get a type from a string, though, I think you'd need the entire FULLY QUALIFIED name like:

    Type T = Type.GetType("WindowsFormsApplication1.Order");

Afterwards, you'd use GetField() or GetProperty(), and pass them "Header" as I demonstrated earlier.
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
This is used to tweak the memory usage for your computer, it is used for servers more so than workstations but just be careful editing registry settings as it may cause irreversible results. I hold no responsibility for anything you do to the regist…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

815 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now