Home > Back-end >  C#: Why does my string return object type and not the value it contains?
C#: Why does my string return object type and not the value it contains?

Time:09-27

I am looping through a List, and trying to instantiate one of the properties as a string, but it returns the type:

{Namespace.Collection}

If I put a break-point, I can see that it holds the value I need.

How can I make it return the value and not the type?

foreach (var PropertyName in ListName) {
    string n = PropertyName.ToString();
}

UPDATE (added more of my code, as well as an attempt of implementing suggested solutions):

foreach (DataRow dr in ds.Tables[0].Rows) {

//PaidTrips is my ObservableCollection instance.
//PaidTrip is my holder class which it has been bound to.

                        PaidTrips.Add(new PaidTrip {

                            LicenseHolderID = dr[0].ToString(),
                            // adding more properties
                        });

                        List<PaidTrip> theseTrips = PaidTrips
                            .GroupBy(p => new { p.LicenseHolderID })
                            .Select(g => g.First())
                            .ToList();
                       
                        foreach (PaidTrip PaidTrips in theseTrips) {

                            foreach (var LicenseHolderID in PaidTrips.GetType().GetProperties()) {

                                string n = LicenseHolderID.GetValue(PaidTrips).ToString();

// code to create PDF
}

gfx.DrawString(n, new XFont("Arial", 40, XFontStyle.Bold), ridelGreen, new XPoint(40, 350));

This is what I do with string n. But when the PDF is created, the string output is System.Action1[System.Action]`

What am I doing wrong?

CodePudding user response:

For your question - I guess that ListName is not of type string and so you get the expected behavior (see: https://docs.microsoft.com/en-us/dotnet/api/system.object.tostring?view=net-5.0#the-default-objecttostring-method)

In that case you can override the ToString() function of that object to return whatever you need like this:

   public override string ToString()
   {
      return "whatever you want including class properties";
   }

On another note, the general approach to variable naming in C# is camelCase and starts with lower case so I suggest to name your variables propertName instead of PropertyName and listName instead of ListName.

Moreover - naming variables for how they are implemented (ListName) is not a best practice as it binds them together, not allowing flexibility in case implementation changes (that comment is true only if it makes sense, as I dont see all the code)

Cheers

CodePudding user response:

You need to loop through the Property Types in your custom class, after looping through the list. First we need an additional loop - to loop through each ClassName Object in ListName list.

            foreach (ClassName myObj in ListName)
            {
                foreach (var PropertyName in myObj.GetType().GetProperties())
                {
                    string n = PropertyName.GetValue(myObj).ToString();
                }
            }

Then we need to loop the actual properties of the current loop ClassName object.

Then you pass the argument .GetValue (as you are now looping through the properties - the actual properties assigned, not the definition of properties).

After, you still need to specify what object you want the value of. So by passing myObj, you are specifying the ClassName->Property of the current loop of ListName.

EDIT:


            List<Notes> myNotesNow = new List<Notes>();

            myNotesNow.Add(new Notes
            {
                note1 = "Valuye"
                // adding more properties
            });

            List<Notes> theseTrips = myNotesNow;

            foreach (Notes PaidTrips in theseTrips)
            {

                foreach (var myVariable in PaidTrips.GetType().GetProperties())
                {

                    string n = myVariable.GetValue(PaidTrips).ToString();

                    string forBreakPoint = "";
                    // code to create PDF
                }

            }
  • Related