如何从值中获取字段的 FieldInfo
How to get the FieldInfo of a field from the value
我想访问 FieldInfo,用于字段上的 CustomAttributes 以及其他目的,但我不希望使用字符串来访问该字段,也不必 运行 通过class.
中的所有字段
如果我有,
class MyClass
{
#pragma warning disable 0414, 0612, 0618, 0649
private int myInt;
#pragma warning restore 0414, 0612, 0618, 0649
public MyClass()
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
Console.WriteLine( GetType().GetField("myInt", flags) );
foreach( FieldInfo fi in GetType().GetFields(flags) )
{
Console.WriteLine( string.Format("{0} {1} {2}", fi.Name, myInt, fi.GetValue(this) ) );
}
}
}
我知道我可以通过 "GetField" 函数直接访问 "myInt" 的 FieldInfo,如果我有它的名称字符串,或者循环通过 "GetFields",那将再次依赖使用字符串 "myInt" 以确保您拥有正确的字段。
是否有像 ref myInt
或 out myInt
或一些我还不知道的关键字可以让我访问的魔法,或者我是否仅限于需要要获取的字符串名称?
您的意思是从编译的表达式而不是字符串中获取成员信息?例如
class Program
{
public static void Main()
{
var cls = new MyClass();
Console.WriteLine(GetMemberInfo(cls, c => c.myInt));
Console.ReadLine();
}
private static MemberInfo GetMemberInfo<TModel, TItem>(TModel model, Expression<Func<TModel, TItem>> expr)
{
return ((MemberExpression)expr.Body).Member;
}
public class MyClass
{
public int myInt;
}
}
在 C# 6 (you can get the CTP here) 中有 nameof(...)
运算符 - 你会使用:
string name = nameof(myInt);
var fieldInfo = GetType().GetField(name, flags);
这是您的选择,还是必须使用 C# 5.0 (.NET 4.5)?
我想访问 FieldInfo,用于字段上的 CustomAttributes 以及其他目的,但我不希望使用字符串来访问该字段,也不必 运行 通过class.
中的所有字段如果我有,
class MyClass
{
#pragma warning disable 0414, 0612, 0618, 0649
private int myInt;
#pragma warning restore 0414, 0612, 0618, 0649
public MyClass()
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
Console.WriteLine( GetType().GetField("myInt", flags) );
foreach( FieldInfo fi in GetType().GetFields(flags) )
{
Console.WriteLine( string.Format("{0} {1} {2}", fi.Name, myInt, fi.GetValue(this) ) );
}
}
}
我知道我可以通过 "GetField" 函数直接访问 "myInt" 的 FieldInfo,如果我有它的名称字符串,或者循环通过 "GetFields",那将再次依赖使用字符串 "myInt" 以确保您拥有正确的字段。
是否有像 ref myInt
或 out myInt
或一些我还不知道的关键字可以让我访问的魔法,或者我是否仅限于需要要获取的字符串名称?
您的意思是从编译的表达式而不是字符串中获取成员信息?例如
class Program
{
public static void Main()
{
var cls = new MyClass();
Console.WriteLine(GetMemberInfo(cls, c => c.myInt));
Console.ReadLine();
}
private static MemberInfo GetMemberInfo<TModel, TItem>(TModel model, Expression<Func<TModel, TItem>> expr)
{
return ((MemberExpression)expr.Body).Member;
}
public class MyClass
{
public int myInt;
}
}
在 C# 6 (you can get the CTP here) 中有 nameof(...)
运算符 - 你会使用:
string name = nameof(myInt);
var fieldInfo = GetType().GetField(name, flags);
这是您的选择,还是必须使用 C# 5.0 (.NET 4.5)?