Ils pourraient être utilisés comme suit:
FieldInfo field = fieldof(string.Empty);
MethodInfo method1 = methodof(int.ToString);
MethodInfo method2 = methodof(int.ToString(IFormatProvider));
fieldof
a pu être réalisé pour IL comme:
ldtoken <field>
call FieldInfo.GetFieldFromHandle
methodof
a pu être réalisé pour IL comme:
ldtoken <method>
call MethodBase.GetMethodFromHandle
Chaque fois que l' typeof
opérateur est utilisé, vous obtenez une parfaite Trouver Toutes les Références des résultats. Malheureusement, dès que vous aller aux champs ou méthodes, vous vous retrouvez avec nasty hacks. Je pense que vous pouvez faire ce qui suit... ou vous pouvez revenir à l'obtention d'un champ par son nom.
public static FieldInfo fieldof<T>(Expression<Func<T>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return (FieldInfo)body.Member;
}
public static MethodInfo methodof<T>(Expression<Func<T>> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
public static MethodInfo methodof(Expression<Action> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
public static void Test()
{
FieldInfo field = fieldof(() => string.Empty);
MethodInfo method1 = methodof(() => default(string).ToString());
MethodInfo method2 = methodof(() => default(string).ToString(default(IFormatProvider)));
MethodInfo method3 = methodof(() => default(List<int>).Add(default(int)));
}