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
