Hi,

A while back, I asked about how to check the attributes of a method from
within mono, and got a very helpful response from Paolo (reproduced
below).  I had a follow up question: how can I use the MonoCustomAttrInfo
struct to figure out the values of certain public fields (e.g. string
fields) defined inside the attribute?

One way, I guess would be to read the constructor parameters from the
metadata (as done in create_custom_attr in reflection.c), but it would
probably be quicker to read the information directly from internal mono
structures since the attribute object has already been created for the
method.  How do I do this?

Thanks for your help,

Hamza.

-----------------------------------------------


[Mono-list] Method Attributes 
Paolo Molaro [EMAIL PROTECTED] 
Mon, 18 Aug 2003 18:24:33 +0200 

Previous message: [Mono-list] Method Attributes 
Next message: [Mono-list] Nant 0.8.2 question 
Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] 

--------------------------------------------------------------------------------

On 08/18/03 Hamza Karamali wrote:
> Thanks for the info.  However, I want to do this within the mono C code
> (I'm a Master's student trying to hack mono for research) -- not from
C#.
> While I am compiling a method (in mini_method_compile, for example), I'd
> like to check the method attributes by referencing its metadata
directly.
> Is there any easy way to do this in mono?  Or do I have to read the CLI
> specs and then use the functions in metadata.c in an appropriate manner?

You can call:
        MonoCustomAttrInfo* attributes = mono_custom_attrs_from_method
(method);

It returns NULL if there are no attributes defined for the method.
MonoCustomAttrInfo is defined in reflection.h. You can run a loop
over the attrs array elements, checking whether the ctor belongs
to the attribute class that interests you. For example, given:

        class MySpecialAttribute: Attribute {...}
and
        [MySpecialAttribute]
        public void method (...) {...}

When compiling method, you can do something like (untested):

        // my_special_attr should be cached...
        MonoClass *my_special_attr = mono_class_from_name (image, "Hack",
"MySpecialAttribute");
        MonoCustomAttrInfo* attributes = mono_custom_attrs_from_method
(method);
        if (!attributes)
                return; // no special processing requested
        for (i = 0; i < attributes->num_attrs; ++i) {
                if (attributes->attrs [i].ctor->klass == my_special_attr)
{
                        // do something special with method
                        break;
                }
        }
        mono_custom_attrs_free (attributes);

lupus

-- 
-----------------------------------------------------------------
[EMAIL PROTECTED]                                     debian/rules
[EMAIL PROTECTED]                             Monkeys do it better



_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to