【发布时间】:2015-03-11 12:22:21
【问题描述】:
与我的上一个问题类似,当我询问从那里的答案中获取字段的 FieldInfo How to get the FieldInfo of a field from the value 时,我编译了这个帮助程序类,
using System;
using System.Reflection;
using System.Linq.Expressions;
internal class Program
{
class MyClass
{
#pragma warning disable 0414, 0612, 0618, 0649
private int myInt = 24;
#pragma warning restore 0414, 0612, 0618, 0649
public const BindingFlags _flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
public MyClass()
{
MemberInfo myIntMI = GetMemberInfo(this, c => c.myInt);
Console.WriteLine(myIntMI.Name + ": " + GetFieldValue(myIntMI) + ", " + GetFieldInfo(myIntMI).FieldType);
// MemberInfo tfMI = GetMemberInfo(this, cw => cw.testFunction());
// MemberInfo tfMI = GetMemberInfo(this, cw => cw.testFunction);
// Console.WriteLine(tfMI.Name + ": " + GetFieldValue(tfMI) + ", " + GetFieldInfo(tfMI).FieldType);
foreach( var mi in GetType().GetMethods(_flags) )
{
Console.WriteLine("method: " + mi);
}
}
private void testFunction() { }
private object GetFieldValue(MemberInfo mi)
{
return GetFieldInfo(mi).GetValue(this);
}
private FieldInfo GetFieldInfo(MemberInfo mi)
{
return GetType().GetField(mi.Name, _flags);
}
private MemberInfo GetMemberInfo<TModel, TItem>(TModel model, Expression<Func<TModel, TItem>> expr)
{
return ( (MemberExpression)expr.Body ).Member;
}
}
}
使用GetMemberInfo(this, c => c.myInt 效果很好,但注释掉的行是我现在感到困惑的地方,GetMemberInfo(this, c => c.testFunction) 或GetMemberInfo(this, c => c.testFunction())。
有没有什么方法可以在不进行字符串比较的情况下,从GetMethods() 或GetMethod("testFunction") 中获取成员信息?
【问题讨论】:
-
我认为(但无法验证)为了能够将
c => c.testFunction()传递给GetMemberInfo,第二个参数的类型必须是Expression<Action<TModel>>。为了能够传递c => c.testFunction,我认为您的参数必须是Expression<Func<TModel, Action>>类型。由于testFunction没有返回类型,TItem不会起作用。
标签: c# reflection fieldinfo memberinfo