tags:

views:

57

answers:

2

No one answers my question in http://stackoverflow.com/questions/1295344/difference-between-activator-createinstance-and-typeoft-invokemember-with-b/2500960#2500960. I guess that the issue is closed and I am asking here again.

Ben M have a nice function which I need for a project. The function is -

public static T CreateInstance<T>() 
{ 
    bool bNeedSecurityCheck = true; 
    bool canBeCached = false; 
    RuntimeMethodHandle emptyHandle = RuntimeMethodHandle.EmptyHandle; 
    return (T) RuntimeTypeHandle.CreateInstance(typeof(T) as RuntimeType, true, true, ref canBeCached, ref emptyHandle, ref bNeedSecurityCheck); 
} 

I am using .NET 3.5 and Visual studio 2008. It gives the error "EmptyHandle type name does not exist in the type System.RuntimeMethodHandle".

Then I used "RuntimeMethodHandle emptyHandle = new RuntimeMethodHandle();". Another error presents. RuntimeTypeHandle does not have a CreateInstance method either. Activator has. But it does not take any ref parameter.

Thanks for clarification in advance!

A: 

I see no indication that it exists even in .NET 4 - at least publicly.

I suspect it may be an internal property, but if that's the case you should treat it as if it didn't exist.

Jon Skeet
+3  A: 

EmptyHandle is an internal static property on RuntimeMethodHandle. From Reflector:

internal static RuntimeMethodHandle EmptyHandle {
    get {
        return new RuntimeMethodHandle(null);
    }
}

Luckily, you don't have to implement the method yourself - use Activator.CreateInstance<T> (Ben M's 'nice function' was just the decompiled source code for that .NET class method).

Jeff Sternal
Property, not method - but otherwise, yes :)
Jon Skeet
"Get accessor method"? ;) (D'oh)
Jeff Sternal