Их можно использовать следующим образом:
FieldInfo field = fieldof(string.Empty);
MethodInfo method1 = methodof(int.ToString);
MethodInfo method2 = methodof(int.ToString(IFormatProvider));
fieldof
может быть скомпилирован в IL как:
ldtoken <field>
call FieldInfo.GetFieldFromHandle
methodof
может быть скомпилирован в IL как:
ldtoken <method>
call MethodBase.GetMethodFromHandle
Всякий раз, когда используется оператор typeof
, вы получаете идеальные результаты поиска "Все ссылки". К сожалению, как только вы отправляетесь на поля или методы, вы оказываетесь в неприятных хаках. Я думаю, вы могли бы сделать следующее... или вы можете вернуться к получению поля по имени.
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)));
}