Just realised my silly mistake, I use IsAssignable from when I have the Type not the object, with the object is is perfectly fine to use, arghhh :\, what was I thinking :P.
Cheers Stefan On Sat, Dec 20, 2008 at 10:34 AM, Stefan Sedich <[email protected]> wrote: > I for some very very odd reason thought that. > > Thing : IAuditableEntity > Couch : Thing > > if couch is IAuditableEntity would not work in this case, this is > where isAssignableFrom from does, for some odd reason did not realise > is, 'is' fine to use. > > > We learn something every day. > > > > Cheers > Stefan > > > On Sat, Dec 20, 2008 at 2:52 AM, MAMMON <[email protected]> wrote: >> >> I am not an expert on this, but here is what I've found. >> >> Considering the line: >> if (typeof(IAuditableEntity).IsAssignableFrom(entity.GetType())) >> >> versus >> >> if (entity is IAuditableEntity) >> >> I set up a test project, created an IAuditableEntity interface, a >> class that implements it, and issues the 2 different "if" statements. >> Then I opened the assembly with reflector, to see the MSIL code that >> is generated. >> >> >> Using "entity is IAuditableEntity" results in: >> >> L_008b: ldloc.1 // loads local var at index 1 ("entity") >> onto the evaluation stack >> >> L_008c: isinst is_test.IAuditableEntity // pops the top >> var off the evaluation stack, testing if it's an instance of >> IAuditableEntity >> >> >> >> Using "typeof(IAuditableEntity).IsAssignableFrom(entity.GetType()) >> results in: >> >> L_00b3: ldtoken is_test.IAuditableEntity // Converts a >> metadata token to its runtime representation, pushing it onto the >> evaluation stack >> >> L_00b8: call class [mscorlib]System.Type [mscorlib] >> System.Type::GetTypeFromHandle(valuetype [mscorlib] >> System.RuntimeTypeHandle) // Gets the type of IAuditableEntity >> from the handle we just pushed onto the stack >> >> L_00bd: ldloc.1 // pushes "entity" onto the stack (local >> var at index 1) >> >> L_00be: callvirt instance class [mscorlib]System.Type [mscorlib] >> System.Object::GetType() >> >> L_00c3: callvirt instance bool [mscorlib] >> System.Type::IsAssignableFrom(class [mscorlib]System.Type) >> >> >> >> So using the "is" operator issues a single IL instruction: isint. >> >> Using if (typeof(IAuditableEntity).IsAssignableFrom(entity.GetType())) >> results in: >> + ldtoken instruction >> + function call (System.Type::GetTypeFromHandle) >> + virtual call (System.Object::GetType()) >> + virtual call (System.Type::IsAssignableFrom) >> >> >> Keep in mind that virtual calls are more expensive than regular >> function calls as well. >> >> >> I would use the "is" operator. It's a built in operator that issues a >> single IL instruction. >> >> >> >> >> >> >> >> >> On Dec 18, 3:09 pm, "Stefan Sedich" <[email protected]> wrote: >>> Heh what a post to wake upto, thanks guys, I will look into using the >>> events look 100 times easier. >>> >>> Cheers >>> Stefan >>> >>> >>> >>> On Fri, Dec 19, 2008 at 7:00 AM, Will Shaver <[email protected]> wrote: >>> > Now you've just got me all confused and showing my ignorance. ;) >>> >>> > On Thu, Dec 18, 2008 at 1:55 PM, Tuna Toksöz <[email protected]> wrote: >>> >>> >> and assuming you are not talking about managed c++ >>> >>> >> On Thu, Dec 18, 2008 at 11:52 PM, Tuna Toksöz <[email protected]> wrote: >>> >>> >>> boxing in c++? >>> >>> Are you sure that casting takes cycles? I think it doesn't, because it >>> >>> is >>> >>> the cmpilers job to cast. >>> >>> >>> On Thu, Dec 18, 2008 at 11:25 PM, Will Shaver <[email protected]> >>> >>> wrote: >>> >>> >>>> Yes, but with both Daniel and Tuna's examples are incomplete. >>> >>>> if (typeof(IAuditableEntity).IsAssignableFrom(entity.GetType())) { >>> >>>> ((IAuditableEntity) entity).Audit(); >>> >>>> } >>> >>>> or >>> >>>> if (entity is IAuditableEntity) { >>> >>>> ((IAuditableEntity) entity).Audit(); >>> >>>> } >>> >>>> In BOTH cases you have to do TWO casts. In mine you only have to do >>> >>>> one. >>> >>>> I learned in C++ where casting and boxing take cycles. >>> >>>> -Will >>> >>> >>>> On Thu, Dec 18, 2008 at 1:17 PM, Tuna Toksöz <[email protected]> wrote: >>> >>> >>>>> or >>> >>> >>>>> if (entity is IAuditableEntity) >>> >>>>> ? :) >>> >>> >>>>> On Thu, Dec 18, 2008 at 11:08 PM, Daniel Fernandes >>> >>>>> <[email protected]> wrote: >>> >>> >>>>>> Beside the point I know but : >>> >>>>>> if (typeof(IAuditableEntity).IsAssignableFrom(entity.GetType())) { >>> >>>>>> to >>> >>>>>> var auditable = entity as IAuditableEntity; >>> >>>>>> if (auditable != null) { >>> >>> >>>>>> isn't easier to read ? >>> >>> >>>>>> On Dec 18, 6:35 am, "Stefan Sedich" <[email protected]> wrote: >>> >>>>>> > Hello, >>> >>> >>>>>> > I am setting date last modified audit on an entity, I implement an >>> >>>>>> > IAuditableEntity interface and use a helper to set the date >>> >>>>>> > modified: >>> >>> >>>>>> > public override bool OnFlushDirty(object entity, object id, >>> >>>>>> > object[] >>> >>>>>> > currentState, object[] previousState, string[] propertyNames, >>> >>>>>> > global::NHibernate.Type.IType[] types) { >>> >>> >>>>>> > if >>> >>>>>> > (typeof(IAuditableEntity).IsAssignableFrom(entity.GetType())) { >>> >>> >>>>>> > // If entity is auditable as this is only an update >>> >>>>>> > set the last modified date. >>> >>>>>> > SetValue(propertyNames, currentState, item => >>> >>>>>> > item.LastModified, DateTime.Now); >>> >>> >>>>>> > } >>> >>> >>>>>> > return false; >>> >>>>>> > } >>> >>> >>>>>> > Type safe helper: >>> >>> >>>>>> > public void SetValue<T>(string[] propertyNames, object[] state, >>> >>>>>> > Expression<System.Func<IAuditableEntity, T>> propertyExpression, T >>> >>>>>> > value) { >>> >>> >>>>>> > var memberExpression = propertyExpression.Body as >>> >>>>>> > MemberExpression; >>> >>>>>> > if (memberExpression == null) >>> >>>>>> > throw new ArgumentException("The member expression >>> >>>>>> > was >>> >>>>>> > not a valid member expression."); >>> >>> >>>>>> > string name = memberExpression.Member.Name; >>> >>>>>> > int index = propertyNames.ToList().IndexOf(name); >>> >>> >>>>>> > if(index == -1) >>> >>>>>> > throw new >>> >>>>>> > InvalidOperationException(string.Format("Property {0} does no exist >>> >>>>>> > on >>> >>>>>> > entity.", name)); >>> >>> >>>>>> > state[index] = value; >>> >>> >>>>>> > } >>> >>> >>>>>> > Now the question is, I saw that you must set the current state and >>> >>>>>> > not >>> >>>>>> > the entity directly why would >>> >>> >>>>>> > var ent = entity as IAuditableEntity; >>> >>>>>> > ent.LastModified = DateTime.Now; >>> >>> >>>>>> > Not work properly or will it be fine to do this? >>> >>> >>>>>> > Thanks >>> >>> >>>>>> > -- >>> >>>>>> > Stefan Sedich >>> >>>>>> > Software Developerhttp://weblogs.asp.net/stefansedich >>> >>> >>>>> -- >>> >>>>> Tuna Toksöz >>> >>>>>http://tunatoksoz.com >>> >>> >>>>> Typos included to enhance the readers attention! >>> >>> >>> -- >>> >>> Tuna Toksöz >>> >>>http://tunatoksoz.com >>> >>> >>> Typos included to enhance the readers attention! >>> >>> >> -- >>> >> Tuna Toksöz >>> >>http://tunatoksoz.com >>> >>> >> Typos included to enhance the readers attention! >>> >>> -- >>> Stefan Sedich >>> Software Developerhttp://weblogs.asp.net/stefansedich >> >> >> > > > > -- > Stefan Sedich > Software Developer > http://weblogs.asp.net/stefansedich > -- Stefan Sedich Software Developer http://weblogs.asp.net/stefansedich --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/nhusers?hl=en -~----------~----~----~----~------~----~------~--~---
