[IronPython] .NET attributes for methods

Lukas Cenovsky cenovsky at bakalari.cz
Fri Nov 13 22:22:17 CET 2009


Thanks to Shri and the new clrtype both issues are resolved. I will post 
details soon on my blog.

--
-- Lukáš

Lukas Cenovsky wrote:
> Help with getting properties to work will hopefully resolve the 
> databinding as well ;-)
>
> The property getter looks wrong but I have no idea what's wrong:
>
> py> props = a.root.listbox1.Items[0].GetType().GetProperties()
> py> props
> => Array[PropertyInfo]((<System.Reflection.RuntimePropertyInfo object at 0x000000000000002C [System.String name]>))
> py> prop = props[0]
> py> prop.GetGetMethod()
> => <System.Reflection.RuntimeMethodInfo object at 0x000000000000002B [System.String name()]>
> py> prop.GetGetMethod().Invoke(a.root.listbox1.Items[0], None)
> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
>   at <module> in <string>, line 0
>   
>
> Just for clarification "a" is Silverlight Application instance
>
> As for the interface error - this is a different strory. You may 
> remember I created WCF service in IronPython with just interface 
> defined in C#. To be able to move interface to IronPython, I need such 
> interface to work with Silverlight too because Silverlight is the 
> cause why I am building WCF services.
>
> --
> -- Lukáš
>
>
> Shri Borde wrote:
>>
>> I can help you create a property. And I can help you get it to work 
>> with your decorators (you can check if the "name" property exposes 
>> your @notify_property wrapper methods or not, and presumably that 
>> works). Beyond that, you are on your own :)
>>
>>  
>>
>> I would try calling the property methods to make sure they are 
>> accessible. Something like this. If that works, I am not sure what 
>> Silverlight needs to make databinding happy.
>>
>>  
>>
>> props = a.root.listbox1.Items[0].GetType().GetProperties()
>>
>> prop = props[0]
>>
>> prop.GetGetMethod.Invoke(a, None) # call using Reflection
>>
>>  
>>
>> About the "SystemError: Application code cannot access 
>> System.AppDomain.get_CurrentDomain() using Reflection." error when 
>> defining interfaces, it could be worked around. We need to call 
>> AppDomain.DefineDynamicAssembly, and IronPython itself does do this. 
>> So its just a question of figuring out the right way to access an 
>> AppDomain instance. Will look into it, but I doubt it will help you 
>> with data binding.
>>
>>  
>>
>> *From:* users-bounces at lists.ironpython.com 
>> [mailto:users-bounces at lists.ironpython.com] *On Behalf Of *Lukas Cenovsky
>> *Sent:* Friday, November 13, 2009 5:42 AM
>> *To:* Discussion of IronPython
>> *Subject:* Re: [IronPython] .NET attributes for methods
>>
>>  
>>
>> This looks very promising but I cannot make it work. I have changed 
>> product.py in DevHawk's example to:
>>
>> #from clrtypeold import ClrMetaclass
>> import clrtype
>>  
>> class Product(object):
>>   #__metaclass__ = ClrMetaclass
>>   __metaclass__ = clrtype.ClrClass
>>   _clrnamespace = "DevHawk.IronPython.ClrTypeSeries"
>>   #_clrproperties = {
>>     #"name":str,
>>     #"cost":float,
>>     #"quantity":int,
>>     #}
>>     
>>   def __init__(self, name, cost, quantity):
>>     self.name = name
>>     self.cost = cost
>>     self.quantity = quantity
>>     
>>   def calc_total(self):
>>     return self.cost * self.quantity
>>  
>>   @property
>>   @clrtype.accepts()
>>   @clrtype.returns(str)
>>   def name(self):
>>       return self._name
>>  
>>   @name.setter
>>   @clrtype.accepts(str)
>>   @clrtype.returns()
>>   def name(self, value):
>>       self._name = value
>>  
>>
>> When I run it I don't see any items in the listbox. When I check the 
>> name, it is a property:
>>
>> py> a.root.listbox1.Items[0]
>> => <Product object at 0x000000000000002B>
>> py> a.root.listbox1.Items[0].GetType().GetProperties()
>> => Array[PropertyInfo]((<System.Reflection.RuntimePropertyInfo object at 0x000000000000002C [System.String name]>))
>>  
>>
>> Whe I used the old clrtype with _clrproperties = {'name': str, ...}, 
>> it worked.
>>
>> --
>> -- Lukáš
>>
>>
>> Shri Borde wrote:
>>
>> Here is an updated version of clrtype.py that uses @property + 
>> @clrtype.accepts/@clrtype.returns to indicate a CLR property, instead 
>> of using "_clrproperties". I think its more Pythonic in general, but 
>> also you should be able to modify @notify_property to work with it.
>>
>>  
>>
>> Note that notify_property won't just work. You will have to change it 
>> to propagate the func_name, arg_types, and return_type properties 
>> from the old getter/setter function objects to the new getter/setter 
>> function objects since these values are used by clrtype to generate 
>> the CLR members. Something like this:
>>
>>  
>>
>> class notify_property(property):
>>
>>  
>>
>>     def propagate_attributes(old_function, new_function):
>>
>>         new_function.func_name = old_function.func_name
>>
>>         new_function.arg_types = old_function.arg_types
>>
>>         new_function.return_type = old_function.return_type
>>
>>  
>>
>>     def __init__(self, getter):
>>
>>         def newgetter(slf):
>>
>>             try:
>>
>>                 return getter(slf)
>>
>>             except AttributeError:
>>
>>                 return None
>>
>>         propagate_attributes(getter, newgetter)
>>
>>         super(notify_property, self).__init__(newgetter)
>>
>>  
>>
>>     def setter(self, setter):
>>
>>         def newsetter(slf, newvalue):
>>
>>             oldvalue = self.fget(slf)
>>
>>             if oldvalue != newvalue:
>>
>>                 setter(slf, newvalue)
>>
>>                 slf.OnPropertyChanged(setter.__name__)
>>
>>         propagate_attributes(setter, newsetter)
>>
>>         return property(
>>
>>             fget=self.fget,
>>
>>             fset=newsetter,
>>
>>             fdel=self.fdel,
>>
>>             doc=self.__doc__)
>>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20091113/64c07a59/attachment.html>


More information about the Ironpython-users mailing list