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
-~----------~----~----~----~------~----~------~--~---

Reply via email to