2010-03-24 3 views
0

Никто не отвечает на мой вопрос в Difference between Activator.CreateInstance() and typeof(T).InvokeMember() with BindingFlags.CreateInstance. Я думаю, что проблема закрыта, и я спрашиваю здесь еще раз.Какая версия .NET содержит RuntimeMethodHandle.EmptyHandle?

Ben M имеет прекрасную функцию, которая мне нужна для проекта. Функция -

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

EmptyHandle является внутренним статическим свойством на RuntimeMethodHandle. Из Рефлектор:

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

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

+0

Свойство, а не метод, но в остальном, да :) –

+0

«Получить метод доступа»? ;) (D'oh) –

1

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

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

Смежные вопросы