Определить, относится ли переменная к ленивому типу

Быстрый вопрос - есть ли более "красивый" способ определить, была ли переменная инициализирована лениво, чем:

var paramType = param.GetType();
if (paramType.FullName.Contains("System.Lazy")) 
{
    ...
}

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


person brovar    schedule 28.08.2019    source источник


Ответы (3)


Попробуй это:

if (paramType.IsGenericType && paramType.GetGenericTypeDefinition() == typeof(Lazy<>))

Он должен вернуть true, если param равно Lazy<T>paramType равно param.GetType()).

person mm8    schedule 28.08.2019

Вместо этого вы можете сравнить общее определение вашего параметра:

Lazy<int> test = new Lazy<int>();
Console.WriteLine(typeof(Lazy<>) == test.GetType().GetGenericTypeDefinition());

Возможно, вы захотите сохранить typeof(Lazy<>) в статической переменной.

person Haytam    schedule 28.08.2019

Здесь два крайних случая: когда тип не является сконструированным универсальным типом, и когда тип является подтипом Lazy. Так что-то вроде

typeof(Lazy<>).IsAssignableFrom(paramType.IsConstructedGenericType?paramType.GetGenericTypeDefinition():null);
person David Browne - Microsoft    schedule 28.08.2019