Solved

C# - Get value of property from an object dynamically

Posted on 2012-03-10
7
357 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
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 
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

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

757 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

25 Experts available now in Live!

Get 1:1 Help Now