Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Problem passing array to .NET COM
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
COM/DCOM et OLE Automation
Versions des environnements
Visual FoxPro:
VFP 9 SP2
OS:
Windows 7
Divers
Thread ID:
01523745
Message ID:
01523936
Vues:
49
Viv,

Thank you for the informative response. I tried implementing it but failed when attempting to deserialize. Does the XML output from CURSORTOXML() need to look a certain way for the deserialization to work?

Another thing to point out is that I'm only passing over three properties to populate for the Contact object (i.e. first/last name, email), whereas the Contact class has a lot more properties defined. Would the XML need to contain empty elements for the properties I'm not using?

Thanks.

Jon

>Hi,
>Sounds OK - but if you don't really need a datatable then if's very simple to use a generic list instead. A couple of generic methods will convert any list of objects to XML and back (assuming the objects themselves are serializable). e.g:
public static class Helper
>    {
>        public static List<T> RetrieveList<T>(string s)
>        {
>            XmlSerializer xs = new XmlSerializer(typeof(List<T>));
>            System.Xml.XmlReader v = System.Xml.XmlReader.Create(new StringReader(s));
>            return (List<T>)xs.Deserialize(v);
>        }
>
>        public static string ConvertToXML<T>(List<T> list)
>        {
>            XmlSerializer xs = new XmlSerializer(typeof(List<T>));
>            StringWriter sw = new StringWriter();
>            xs.Serialize(sw, list);
>            return sw.ToString();
>        }
>    }
Example use:
       List<Contact> list = new List<Contact>();
>            list.Add(new Contact { Name = "Fred", Age = 33 });
>            list.Add(new Contact { Name = "Joe", Age = 66 });
>
>            string xmlString = Helper.ConvertToXML<Contact>(list);
>            //(Examine this string to determine what VFP should create)
>
>            List<Contact> retrievedList = Helper.RetrieveList<Contact>(xmlString);
>>Thanks for the tip. In the meantime, I've decided to switch to sending XML and convert that to a DataTable that I can iterate through. That seems to do the trick for now.
>>
>>Jon
>>
>>>>My C# COM DLL has a public method with the following signature:
>>>>
>>>>public void AddClientsToList(Contact[] contacts, string listName)
>>>>
>>>>
>>>>In VFP, I do the following:
  • Call a DLL method to get a new contact object
  • Populate the properties
  • Create an array and place the object in the first element
  • Call COMARRAY(loDLL,10)

>>>>When I attempt loDLL.AddClientsToList(@MyArray, "test"), I get a type mismatch COM error.
>>>>
>>>>Any ideas on what I'm doing wrong?
>>>
>>>No. But passing arrays of anything is always a pain. Since you have control of both sides maybe it would be simpler to just pass the Contacts in one-by-one? e.g:
public class MyDll
>>>    {
>>>        Dictionary<string, List<Contact>> lists = new Dictionary<string, List<Contact>>();
>>>        public Contact GetNewContact() { return new Contact();}
>>>       
>>>        public void AddClientToList(Contact contact,string listName)
>>>        {
>>>             if (!lists.Keys.Contains(listName))
>>>                lists.Add(listName, new List<Contact>());
>>>            lists[listName].Add(contact);
>>>        }
>>>    }
Jon Rosenbaum
Devcon Drummer
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform