¿Cómo usar la variable local como tipo? El compilador dice "es una variable pero se usa como un tipo"

En tiempo de ejecución, no sé qué tipo de variablev1 es. Por esta razón, escribí muchosif else declaraciones:

if (v1 is ShellProperty<int?>)
{
    v2 = (v1 as ShellProperty<int?>).Value;
}
else if (v1 is ShellProperty<uint?>)
{
    v2 = (v1 as ShellProperty<uint?>).Value;
}
else if (v1 is ShellProperty<string>)
{
    v2 = (v1 as ShellProperty<string>).Value;
}
else if (v1 is ShellProperty<object>)
{
    v2 = (v1 as ShellProperty<object>).Value;
}    

La única diferencia está enShellProperty<AnyType>.

Entonces, en lugar de escribir esto con muchoif else declaraciones, decidí usar la reflexión para obtener el tipo de propiedad en tiempo de ejecución:

 Type t1 = v1.GetType().GetProperty("Value").PropertyType;
 dynamic v2 = (v1 as ShellProperty<t1>).Value;

Este código obtiene elPropertyType dev1 y lo asigna a la variable localt1, pero después de eso, mi compilador dice que:

t1 es una variable pero se usa como un tipo

Entonces no me permite escribirt1 dentroShellProperty<>.

Por favor, dígame cómo resolver este problema y cómo obtener un código más compacto que el que tengo. ¿Necesito crear una nueva clase?

Respuestas a la pregunta(2)

Su respuesta a la pregunta