If you search this list for attribute i put up some code a while ago for
handling attribute inheritance. If you cant find it i can next time i am at
a computer. Think method name was geteffectiveattributes

On 24 Apr 2011 13:59, "Hendry Luk" <[email protected]> wrote:
> My example is quite like what you described.
> I have a set of attributes, in my case, of AOP advices.
>
> You have different advice weaving behaviors depending on the attribute you
> put. E.g. there are AroundAttribute (intercept around the targets),
> BeforeAttribute, AfterAttribute, ExceptionAttribute, or even
> AnnotateAttribute (annotating the targets with additional attributes). I
was
> reluctant to put an if-else logic to check these logics, because I want to
> have plugin-like capability in which third-party users are able to inherit
> from the attributes to provide their own custom behaviors.
>
> As a workaround, I was thinking to have the child-classes to set a
property
> which holds the type of the behavior-factory. However, I'm not sure if it
> works since it implies that the reflection would execute this "setter"
> coming from the child-attribute.
>
> E.g.
> public MyCustomAdviceAttribute: AdviceAttribute
> {
> public MyCustomAdviceAttribute: base(typeof(MyAdviceBehaviorFactory))
> {
> }
> }
>
> And via cecil, I would get the value of
> AdviceAttribute.Attributes["Factory"]
>
> I haven't tried that but I doubt that would work.
>
> Another thing is, what's the best way to get a certain custom attributes
> allowing inheritance with cecil? There's only the property of
> CustomAttributes. Does it mean I have to interrogate each of their types,
> then traverse all the way up of each Attribute's line of inheritance, as
> well as all the way up each Method's line of inheritance and repeat and
> rinse?
>
> Cheers
>
> On Sun, Apr 24, 2011 at 9:32 PM, Simon Cropp <[email protected]>
wrote:
>
>> sorry. your correction is correct :)
>>
>> Why do u need to put code in the attribute?
>> Might be helpful if u post some code?
>>
>> On Sun, Apr 24, 2011 at 9:20 PM, Hendry Luk <[email protected]> wrote:
>> > Yes, I'm able to get the metadata of the attributes. But i need to
>> > instantiate it because I do implement the behavior inside of the
>> attribute
>> > for extensibility reason.
>> > I guess mono-cecil is strictly behaving like .net assembly in the
>> > reflection-only mode (although the .net one is even more limited since
>> you
>> > can't even inspect attribute at all, AFAIK).
>> >
>> >> The thing u can do with cecil is instantiate and instance of those
>> >> attributes at runtime.
>> >
>> > Did you mean "you can't"?
>> >
>> > Cheers
>> >
>> > On Sun, Apr 24, 2011 at 5:26 PM, Simon Cropp <[email protected]>
>> wrote:
>> >>
>> >> Hendry
>> >>
>> >> Just to be clear Cecil can read attributes and you can even extract
>> >> out properties and constructor parameters.
>> >> The thing u can do with cecil is instantiate and instance of those
>> >> attributes at runtime. You would have to switch back to standard
>> >> reflection to do that.
>> >>
>> >> So what does this mean for you... Just dont write code in your
>> >> attributes and you will be fine. Use Attributes soley for "metadata"
>> >> then have another class that does something with that metadata.
>> >>
>> >> For example I have an attribute like this
>> >>
>> >> public class NotifyPropertyAttribute : Attribute
>> >> {
>> >> public bool PerformEqualityCheck { get; set; }
>> >> public string[] AlsoNotifyFor { get; set; }
>> >> }
>> >>
>> >> At weaving time I extract the PerformEqualityCheck property using this
>> >> code
>> >>
>> >> static bool? GetCheckForEquality(CustomAttribute notifyAttribute)
>> >> {
>> >> var performEqualityCheck =
>> >> notifyAttribute.Properties.FirstOrDefault(x => x.Name ==
>> >> "PerformEqualityCheck");
>> >> var equalityCheckValue = performEqualityCheck.Argument.Value;
>> >> if (equalityCheckValue != null)
>> >> {
>> >> return (bool)equalityCheckValue;
>> >> }
>> >> return null;
>> >> }
>> >>
>> >> Would this approach meet your requirements?
>> >>
>> >>
>> >> On Sun, Apr 24, 2011 at 12:52 PM, Hendry Luk <[email protected]>
>> wrote:
>> >> > Thanks for the response, Jb.
>> >> > I was speculating there might be a way to convert (i.e. load) from
>> cecil
>> >> > object models into the .net runtime.
>> >> > I use cecil because the main business my application does is weaving
>> >> > assemblies (AOP), and unfortunately in few places I often need to
read
>> >> > attribute metadata to control the weaving behavior.
>> >> > I guess I will need to use both .net reflection and cecil for this,
>> and
>> >> > somehow swap back and forth between them. Efficiency was my concern.
>> >> >
>> >> > Thanks again
>> >> >
>> >> > On Sun, Apr 24, 2011 at 5:55 AM, Jb Evain <[email protected]> wrote:
>> >> >>
>> >> >> Hi,
>> >> >>
>> >> >> On Sat, Apr 23, 2011 at 9:30 PM, Hendry Luk <[email protected]>
>> >> >> wrote:
>> >> >> > Hi,
>> >> >> > Is there any easy way in cecil to get a certain custom-attributes
>> (of
>> >> >> > a
>> >> >> > specific type) from a method, and execute a virtual method on it?
>> >> >> > Just like it can easily be done using a basic System.Reflection.
>> >> >> >
>> >> >> > The only way i can think of is to manually load the assembly
>> >> >> > containing
>> >> >> > that
>> >> >> > attributes (that I've discovered using cecil), then instantiate
the
>> >> >> > attribute using the constructor-arguments information (from
cecil),
>> >> >> > and
>> >> >> > then
>> >> >> > copy across all property-values (from cecil). Once you got the
>> >> >> > attribute
>> >> >> > instance, I can then execute the method. It seems to be a lot of
>> work
>> >> >> > for
>> >> >> > such a _very_ common thing.
>> >> >>
>> >> >> .net attributes have been designed to be instantiated at runtime.
>> >> >> Cecil is not a runtime feature, it just gives you an object model
>> >> >> which maps to the serialized metadata. Cecil has obviously no way
to
>> >> >> instantiate an object based on this metadata.
>> >> >>
>> >> >> If you want to instantiate attributes, you're looking at the wrong
>> >> >> tool.
>> >> >>
>> >> >> > Oh while I'm here, is there also an easy way to do
>> >> >> > type.IsAssignableFrom(type) on cecil? At the moment i'm
recursively
>> >> >> > checking
>> >> >> > all the base-classes within its ancestry line, as well as their
>> >> >> > interfaces,
>> >> >> > but it feels very inefficient, considering it's also a very
common
>> >> >> > thing
>> >> >> > (checking for types assignability is probably far more common
than
>> >> >> > checking
>> >> >> > for an exact equality). Is there a better way to do this?
>> >> >>
>> >> >> Not really, I don't think I have such a method around.
>> >> >>
>> >> >> Jb
>> >> >>
>> >> >> --
>> >> >> --
>> >> >> mono-cecil
>> >> >
>> >> > --
>> >> > --
>> >> > mono-cecil
>> >>
>> >> --
>> >> --
>> >> mono-cecil
>> >
>> > --
>> > --
>> > mono-cecil
>>
>> --
>> --
>> mono-cecil
>
> --
> --
> mono-cecil

-- 
--
mono-cecil

Reply via email to