[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