La vraie réponse: non. C'est une instance de la propriété, de sorte que vous ne pouvez l'appeler que sur une instance. Vous devez créer une instance, ou de faire de la propriété statique comme dans d'autres réponses.
Voir MSDN pour plus d'informations à propos de la différence entre statique et les membres de l'instance.
La langue-dans-joue, mais encore la réponse correcte:
Est-il possible d'obtenir la valeur sans la création d'une instance ?
Oui, mais seulement par le biais de certains de vraiment horrible de code qui crée IL en passant en null
comme this
(que vous n'utilisez pas dans votre propriété), à l'aide d'un DynamicMethod
. Exemple de code:
// 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());
}
}
Merci de ne pas le faire. Jamais. C'est horrible. Il devrait être foulé aux pieds, coupé en petits morceaux, mettre le feu, puis couper à nouveau. Plaisir, n'est-ce pas? ;)
Cela fonctionne parce que c'est à l'aide de call
au lieu de callvirt
. Normalement le compilateur C# serait d'utiliser un callvirt
appel , même si elle n'est pas d'appeler un membre virtuel parce qu'obtient la valeur null de la vérification des références "gratuitement" (dans la mesure où IL stream est concerné). Un non-appel virtuel comme ce n'est pas de vérifier la nullité d'abord, il a juste invoque le membre. Si vous avez coché this
dans l'appel de propriété, que vous pouvez trouver, c'est la valeur null.
EDIT: Comme l'a noté Chris Sinclair, vous pouvez le faire plus simplement à l'aide d'une ouverture d'instance de délégué:
var method = typeof(MyClass).GetProperty("Name").GetGetMethod();
var openDelegate = (Func<MyClass, string>) Delegate.CreateDelegate
(typeof(Func<MyClass, string>), method);
Console.WriteLine(openDelegate(null));
(Mais encore une fois, merci de ne pas!)