Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Handling an object parameter
Message
De
23/04/2013 06:19:37
 
 
À
23/04/2013 06:03:26
Information générale
Forum:
ASP.NET
Catégorie:
Code, syntaxe and commandes
Divers
Thread ID:
01571599
Message ID:
01571655
Vues:
31
Thanks Thomas

I've decided to stay with dynamic object.

Pass the details in one string and then split it based on a delimiter of | .

string[] SplitDescription = ContentsDescription.Split(new Char[] { '|' });

I always stop after one large strong coffee as I know for me it won't taste quite as good and I'll get wired.

>Hi Nick,
>
>sorry, still not getting a clear picture as to what runtime calls which to do what -
>might be me, not firing on all cells (too much coffee, too little sleep...)
>
>Shoveling data from vfp to dotnet, Rick's approaches often revolve around a single scatter object.
>When I shovelled vfp cursors to DotNet Ironpython, AFAIR I sent them over directly via COM into an array like structure
>and built on the vfp side a data dictionary cursor via copy stru extended and sent that over as well with the same mechanism - as it was always 4 cols for the DD-array, easy to work with. For a more object-typical way, such a DD-cursor could be put into a string concatenating the first 4 columns of afields(Cursor2Move) into a CSV list for generic handling on DotNet side.
>
>For cases where the scatter objects returned from vfp like in Ricks example can have different property counts and names, in my 2nd post I hinted at a similar approach, If the cursors used to as source to scatter from have different columns and you want to keep a single object interface, on the fox side something like
>
>= afields(laFields )
>lcCSV = BuildCSV_DD(@laFields)
>addproperty(loFoxReturnObject, "__FldList", m.lcCSV)
>
>&& if your fox code builds returnobjects from different sources, the Filedlist could be built on the object
>lcCSV = ""
>for lnRun = 1 to  amembers(laProps)
>  lcCSV = lcCSV + laProps[m.lnRun] + ","
>next
>addproperty(loFoxReturnObject, "__FldList", m.lcCSV)
>
>should do the trick. On the Dotnet side you have ALWAYS the __FldList property to parse.
>
>Hope I made myself clearer and am not too far off target...
>
>thomas
>
>>>>>>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