Как и предыдущий вопрос, когда я спрашивал о получении поля FieldInfo поля How to get the FieldInfo of a field from the value, из ответов там я скомпилировал этот вспомогательный класс ,Как получить MethodInfo функции класса без сравнения строк
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> '. Чтобы иметь возможность передать 'c => c.testFunction', я * думаю * ваш параметр должен быть типа' Expression > '. Поскольку 'testFunction' не имеет типа возврата,' TItem' не будет играть роли. –