Как получить FieldInfo поля из значения
Я хочу получить доступ к FieldInfo для пользовательских атрибутов, которые находятся в поле, и для других целей, но я бы предпочел не использовать строку для доступа к этому полю или выполнять все поля в классе.
Если у меня просто есть,
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) ) );
}
}
}
Я знаю, что могу получить доступ к FieldInfo "myInt" напрямую через функцию "GetField", если у меня есть строка с его именем, или циклически перебирать "GetFields", что опять-таки будет зависеть от наличия строки "myInt", чтобы гарантировать Правильное поле.
Есть ли какая-то магия, которая доступна как ref myInt
, или же out myInt
или какое-то ключевое слово, о котором я пока не знаю, которое дало бы мне доступ, или я ограничен необходимостью использования строкового имени для его получения?
2 ответа
Вы имеете в виду получение memberinfo из скомпилированного выражения, а не из строки? например
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;
}
}