Какая версия .NET содержит RuntimeMethodHandle.EmptyHandle? - PullRequest
0 голосов
/ 24 марта 2010

Никто не отвечает на мой вопрос в Разница между Activator.CreateInstance () и typeof (T) .InvokeMember () с BindingFlags.CreateInstance . Я думаю, что проблема закрыта, и я спрашиваю здесь снова.

У Бен М есть хорошая функция, которая мне нужна для проекта. Функция -

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); 
} 

Я использую .NET 3.5 и Visual studio 2008. Выдает ошибку «Имя типа EmptyHandle не существует в типе System.RuntimeMethodHandle».

Затем я использовал «RuntimeMethodHandle emptyHandle = new RuntimeMethodHandle ();». Другая ошибка представляет. RuntimeTypeHandle также не имеет метода CreateInstance. Активатор имеет. Но он не принимает никакого параметра ref.

Спасибо за разъяснения заранее!

Ответы [ 2 ]

4 голосов
/ 24 марта 2010

EmptyHandle является внутренним статическим свойством RuntimeMethodHandle. От отражателя:

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

К счастью, вам не нужно реализовывать метод самостоятельно - используйте Activator.CreateInstance<T> («хорошая функция» Бена М была просто декомпилированным исходным кодом для этого метода класса .NET).

1 голос
/ 24 марта 2010

Я не вижу признаков того, что он существует даже в .NET 4 - по крайней мере, публично.

Я подозреваю, что это может быть внутреннее свойство, но если это так, вы должны обращаться с ним, как если бы он не существовал.

...