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
