Thanks greg, I'll search around for that.

On Sun, Apr 24, 2011 at 11:06 PM, Greg Young <[email protected]>wrote:

> 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

-- 
--
mono-cecil

Reply via email to