Hello,

I think this is a really basic question, but I haven't found a solution.  I've 
been asked to use a .NET assembly from python.  I have programed in other 
languages, but not C#.  In the brief time I've used it, PythonNet has been 
fantastic... with one little wrinkle.  

Here's a pared down version of the C#:

namespace Service.API
{
    public class ServiceAPI 
    {
        private static ServiceAPI m_Instance = new ServiceAPI();

        public static ServiceAPI Instance
        {
            get
            {
                return m_Instance;
            }
        }
        
        public ServiceAPI() 
        {
        }

        ~ServiceAPI() {}

        ServiceInformation m_ServiceInformation = new ServiceInformation();

        public List<string> ServiceHosts
        {
            get
            {
                                return m_ServiceInformation.ServiceHosts;
            }
        }
        }

    public class ServiceInformation 
    {
        public List<string> ServiceHosts { get; set; }

        public ServiceInformation()
        {
            ServiceHosts = new List<string>();
        }
        }
}
        
I need to add strings to the List "ServiceHosts" in ServiceAPI.  The author 
placed the List inside another class, "ServiceInformation" and did not provide 
a set method, so that the ServiceHosts could not be altered to another object, 
while allowing strings to be added and removed from it.  

I think adding a string to that list is trivial in C#: (I've been assured by 
the assembly author that this works)
        ServiceAPI.Instance.ServiceHosts.Add('1.1.1.1');

So I try it in Python:
>>> import clr  # Pyton.NET package
>>> clr.AddReference("Service.API")     
>>> import Service.API
>>> import System       # This is a .NET package.  
>>> Service.API.ServiceAPI.Instance.ServiceHosts.Add('1.1.1.1')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'ServiceAPI' object has no attribute 'Add'

This is a List that PythonNet is mapping onto a python list:
>>> Service.API.ServiceAPI.Instance.ServiceHosts
[]

So try using a python method:
>>> Service.API.ServiceAPI.Instance.ServiceHosts.append('1.1.1.1')
>>> Service.API.ServiceAPI.Instance.ServiceHosts
[]

Nope.  And I start suspecting that I've added that string to a boxed version of 
the list.  But because there's no set accessor, I can't do this:
>>> hosts = Service.API.ServiceAPI.Instance.ServiceHosts
>>> hosts.append('1.1.1.1')
>>> Service.API.ServiceAPI.Instance.ServiceHosts = hosts
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: property is read-only

So what about calling the unbound list method, passing in the list?
>>> System.Collections.Generic.List[String].Add(
                Service.API.ServiceAPI.Instance.ServiceHosts, '1.1.1.1')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'ServiceAPI' object has no attribute 'Add'

The author of this assembly has offered to create a specific method so that I 
can access the list, but he assures me that this is a common C# pattern that I 
will encounter frequently.  

I can't just create an instance of ServiceInformation and add the hosts to 
that, ServiceAPI has no method for getting or setting m_ServiceInformation.  

Any help in setting me in the right direction would be appreciated.

Thanks,

Mark Brighton
_______________________________________________
PythonNet mailing list -- pythonnet@python.org
To unsubscribe send an email to pythonnet-le...@python.org
https://mail.python.org/mailman3/lists/pythonnet.python.org/

Reply via email to