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
