Respuesta real: no. Es una propiedad de instancia, por lo que solo puede invocarla en una instancia. Debe crear una instancia o hacer que la propiedad sea estática como se muestra en otras respuestas.
Consulte MSDN para obtener más información acerca de la diferencia entre los miembros estáticos y de instancia.
la lengua en la mejilla, pero aún respuesta correcta:
¿Es posible obtener el valor sin crear una instancia?
Sí, pero sólo a través de un código realmente horrible lo que crea cierta IL que pasa en null
como this
(que no se utiliza en su propiedad), utilizando un DynamicMethod
. Código de muestra:
// Jon Skeet explicitly disclaims any association with this horrible code.
// THIS CODE IS FOR FUN ONLY. USING IT WILL INCUR WAILING AND GNASHING OF TEETH.
using System;
using System.Reflection.Emit;
public class MyClass
{
public string Name { get{ return "David"; } }
}
class Test
{
static void Main()
{
var method = typeof(MyClass).GetProperty("Name").GetGetMethod();
var dynamicMethod = new DynamicMethod("Ugly", typeof(string),
Type.EmptyTypes);
var generator = dynamicMethod.GetILGenerator();
generator.Emit(OpCodes.Ldnull);
generator.Emit(OpCodes.Call, method);
generator.Emit(OpCodes.Ret);
var ugly = (Func<string>) dynamicMethod.CreateDelegate(
typeof(Func<string>));
Console.WriteLine(ugly());
}
}
No haga esto. Ever. Es espantoso. Se debe pisotear, cortar en pedacitos, prender fuego y luego cortar de nuevo. Diversión, ¿no? ;)
Esto funciona porque está usando call
en lugar de callvirt
. Normalmente el compilador de C# usaría una llamada callvirt
, incluso si no está llamando a un miembro virtual porque obtiene la comprobación de referencia nula "gratis" (en lo que respecta a la secuencia IL). Una llamada no virtual como esta no comprueba primero la nulidad de, solo invoca al miembro. Si marcó this
dentro de la llamada de propiedad, encontrará que es nulo.
EDIT: Como se ha señalado por Chris Sinclair, que puede hacer que sea más simple uso de una instancia abierta delegado:
var method = typeof(MyClass).GetProperty("Name").GetGetMethod();
var openDelegate = (Func<MyClass, string>) Delegate.CreateDelegate
(typeof(Func<MyClass, string>), method);
Console.WriteLine(openDelegate(null));
(! Pero, de nuevo, por favor no)
Es necesario hacer que la estática – jglouie
hacer que la propiedad Nombre como estática – HatSoft
yo realmente curiosidad por saber lo que el supuesto caso de uso es aquí que hace el PO creo que deberían hacerlo. – Tim