为什么在C#中没有`fieldof`或'methodof`运算符?

他们可以使用如下:

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运算符,都可以find完美的Find All References结果。 不幸的是,只要你去田野或方法,你最终会讨厌的黑客。 我认为你可以做到以下几点…或者你可以回头去找名字。

 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))); } 

Eric Lippert(C#devise团队)在这里对这个主题进行了很好的概述/讨论。 去引用:

这是一个非常棒的function,几乎所有参与devise过程的人都希望我们能够做到,但是为什么我们select不这样做呢? 如果有一天,devise和实施它是我们可以花费有限的预算的最佳方式,我们将做到这一点。 在此之前,使用reflection。

实际上可以避免使用reflection和lambdas(.NET Framework 2.0)。 考虑以下课程:

 public class methodof<T> { private MethodInfo method; public methodof(T func) { Delegate del = (Delegate)(object)func; this.method = del.Method; } public static implicit operator methodof<T>(T methodof) { return new methodof<T>(methodof); } public static implicit operator MethodInfo(methodof<T> methodof) { return methodof.method; } } 

这是用法:

 MethodInfo writeln = (methodof<Action>)Console.WriteLine; MethodInfo parse = (methodof<Func<string, int>>)int.Parse; 

@ 280Z28 – 当我find你的问题和代码时,我们正坐下来想办法解决这个问题。 我们需要一个PropertyOf方法,所以我添加了它。 这是其他人需要的情况。 Thx的伟大的问题。

  public static PropertyInfo PropertyOf<T>(Expression<Func<T>> expression) { MemberExpression body = (MemberExpression)expression.Body; PropertyInfo pi = body.Member as PropertyInfo; if (pi != null) { return pi; } else throw new ArgumentException("Lambda must be a Property."); } [TestMethod()] public void MethodofPropertyOfTest<T>() { string foo = "Jamming"; MethodInfo method1 = ReflectionHelper.Methodof(() => default(string).ToString()); PropertyInfo prop = ReflectionHelper.PropertyOf(() => default(string).Length); Assert.AreEqual(method1.Invoke(foo, null), "Jamming"); Assert.AreEqual(prop.GetGetMethod().Invoke(foo, null), foo.Length); } 

这是一个genericstypes的版本,可以使用F2来重命名而不需要修改已存在的代码,方法名称为GetPKValue

 var typFactory = typeof(FormFieldFactory<>).MakeGenericType(entity.GetType()); var methodName = new Func<object, object>(FormFieldFactory<object>.GetPKValue).Method.Name; var theMethod = (Func<object, object>)Delegate.CreateDelegate( typeof(Func<object, object>) , typFactory.GetMethod(methodName) ); 

反思变得这么简单的那一天,我r然心动。 如果您认为dynamicSQL很糟糕,这会导致十几倍的恶化。

想象一下,改变一个属性名称,不用担心运行时错误。 /不寒而栗