Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Handling an object parameter
Message
De
23/04/2013 03:58:16
 
 
À
23/04/2013 02:38:22
Information générale
Forum:
ASP.NET
Catégorie:
Code, syntaxe and commandes
Divers
Thread ID:
01571599
Message ID:
01571652
Vues:
37
>>>>Hi
>>>>
>>>>I want to pass into a c# dll and object parameter like this
>>>>
>>>> public string PassRecordObjectDynamic(dynamic FoxObject)
>>>>
>>>>(from Ricks example at
>>>>
>>>>http://www.west-wind.com/weblog/posts/2010/Sep/13/The-dynamic-Type-in-C-Simplifies-COM-Member-Access-from-Visual-FoxPro
>>>>
>>>>but I'm not sure how to handle varying numbers of items in the object in the c# dll.
>>>>
>>>>ie There may be 1 or maybe 10.
>>>>
>>>>I can control what they are called
>>>> like phone1 phone2 etc but I'm not suer what the best way to deal with this in c#
>>>>
>>>>Some sort of macro substitution seems out (from what I've read)
>>>>Any pointers
>>>
>>>**pointer
>>>
>>>seriously it might be a good idea (at least easier coding-wise) to add a list of propertynames on the vfp side.
>>>After casting to dynamic you just parse that list via dot-notation ? Easy if you can be sure of a specific free field/propertyname, for instance __fldlist, to borrow from the pythonic usage of "internal, do not touch" naming.
>>>
>>>Update: from glancing over the code in Rick's article foxObject should be object and cast from COM to dynamic.
>>>Not clear from the method signature iyou showed.
>>>
>>>HTH
>>>
>>>thomas
>>
>>Thanks Thomas
>>
>>I can add the properties on the vfp side no problem. I'm not sure about the best way to access their names at the c# end
>>
>>like phone1 phone2 phone3 etc
>
>if the cast from object to dynamic succeeds, walking the list of propertynames ad calling them via dynmic.singlepropname should work ?
>IIRC all the additional/newfound names land in a hashmap and will work at minimally lower speed due to hashmap access.
>
>Update: seems Rick and Craig are guessing as well ;-) Time to copy and paste some code in vfp and dotnet, and if it is planned to be generic add some text about which cases it should cover.

Ok

this is taken from a test form which posts information to a web service

I want to run this from a dll which I'm calling from a foxpro process.

I'm using foxpro because there's legacy code which gets the infomtion that i want to pass to the web service from a variety of sources (web emails ftp etc) .

the for loop is adding information that might have one item or many.

the first part is no problem its the variable part I'm a but stuck on.

I may pass it as one string and parse it. (c# purists can faint here if they like :-))
    private void submitWaybill()
        {
            logbox.AppendText("Submitting Waybill:");
            PPIntegrationService.Waybill_submitWaybill_Request waybillReq = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request();

            
            //Create a new waybill details object
            waybillReq.details = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Details();
            
            //Inserting a new record
            waybillReq.s_ttype = "I";

            //general details data
            waybillReq.details.s_accnum = accnum.Text;
            waybillReq.details.s_waybill = waybillno.Text;
            waybillReq.details.s_service = servicetextBox.Text;            

            //origin details 
            waybillReq.details.s_origperadd1 = origadd1.Text;
            waybillReq.details.s_origperadd2 = origadd2.Text;
            waybillReq.details.s_origperadd3 = origadd3.Text;
            waybillReq.details.s_origperadd4 = origadd4.Text;
            waybillReq.details.s_origpercell = origcell.Text;
            waybillReq.details.s_origpercontact = origcontact.Text;
            waybillReq.details.s_origperpcode = origpcode.Text;
            waybillReq.details.s_origperphone = origtel.Text;
            waybillReq.details.s_origtown = origtown.Text;
            waybillReq.details.s_origpers = ethgew.Text;


            //destination details
            waybillReq.details.s_destperadd1 = destadd1.Text;
            waybillReq.details.s_destperadd2 = destadd2.Text;
            waybillReq.details.s_destperadd3 = destadd3.Text;
            waybillReq.details.s_destperadd4 = destadd4.Text;
            waybillReq.details.s_destpercell = destcell.Text;
            waybillReq.details.s_destpercontact = destcontact.Text;
            waybillReq.details.s_destperpcode = destpcode.Text;
            waybillReq.details.s_destperphone = desttel.Text;
            waybillReq.details.s_desttown = desttown.Text;
            waybillReq.details.s_destpers = destpers.Text;

            //contents            
            waybillReq.contents = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Contents[dataGridView2.RowCount-1];
              
            for (int i = 0; i < dataGridView2.RowCount-1; i++)
            {
                waybillReq.contents[i] = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Contents();
                //Populate details
                waybillReq.contents[i].i_item = Convert.ToString(dataGridView2.Rows[i].Cells["ItemNo"].Value);
                waybillReq.contents[i].i_pieces = Convert.ToString(dataGridView2.Rows[i].Cells["Pieces"].Value);
                waybillReq.contents[i].s_description = Convert.ToString(dataGridView2.Rows[i].Cells["Description"].Value);
                waybillReq.contents[i].i_dim1 = Convert.ToString(dataGridView2.Rows[i].Cells["Dim1"].Value);                
                waybillReq.contents[i].i_dim2 = Convert.ToString(dataGridView2.Rows[i].Cells["Dim2"].Value);
                waybillReq.contents[i].i_dim3 = Convert.ToString(dataGridView2.Rows[i].Cells["Dim3"].Value);
                waybillReq.contents[i].f_actmass = Convert.ToString(dataGridView2.Rows[i].Cells["Mass"].Value);
            }

            //tracking
            waybillReq.tracks = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Tracks[dataGridView1.RowCount-1];

            for (int i = 0; i < dataGridView1.RowCount-1; i++)
            {
                //Create a new tracking entry
                waybillReq.tracks[i] = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Tracks();
                //Populate details
                waybillReq.tracks[i].i_item = Convert.ToString(dataGridView1.Rows[i].Cells["Item"].Value);
                waybillReq.tracks[i].i_parcelno = Convert.ToString(dataGridView1.Rows[i].Cells["ParcelNo"].Value);
                waybillReq.tracks[i].s_trackno = Convert.ToString(dataGridView1.Rows[i].Cells["Trackno"].Value);

            }

            try
            {      
                //Make the request
                PPIntegrationService.Waybill_submitWaybill_Response waybillResp = this.service.Waybill_submitWaybill(this.token, waybillReq);
                if (waybillResp.errorcode == 0)
                {
                    logbox.AppendText(" Success \n");
                }
                else
                {
                    logbox.AppendText(" Error:" + waybillResp.errormessage + "\n");
                }
            }
            catch (Exception e)
            {
                logbox.AppendText(" Error: " + e.Message + "\n");
            }
            logbox.AppendText("----------------------------------------------------------------------------------------\n");            
        }
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform