【发布时间】:2009-07-31 17:33:41
【问题描述】:
它们可以按如下方式使用:
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)));
}
【问题讨论】:
-
你能想象这个功能一年会被使用多少次吗?
-
我正在用 C# 编写 CLI 实现 - 这对于在 JIT 中识别 IL 中的特殊引用非常有帮助,因此我可以区别对待它们。例如,我想用
ldc.i4 <int32 offset>内联替换call RuntimeHelpers.get_OffsetToStringData的任何IL 实例(在本机代码生成之前)。 -
这是一个经常被请求的功能,因此显然有相当常见的用例。也就是说,显然不会实现自动道具或 where 子句的普及。
-
对于任何处理 WPF(想想依赖属性)的人来说,这将是一个非常有用的功能,更一般地说,对于任何实现
INotifyPropertyChanged的人来说。 -
即使不使用 WPF 的人仍然会抛出
ArgumentException
标签: c# reflection