我正在使用以下代码从匿名类型中检索命名成员.有没有什么方法可以转换后续代码使用lambda表达式来实现这一点,或者至少允许调用代码使用lamda,即使“内心深处”我必须使用字符串?
private T GetAnonymousTypeMember<T>(object anonymousType, string memberName) where T: class
{
var anonTypesType = anonymousType.GetType();
var propInfo = anonTypesType.GetProperty(memberName);
return propInfo.GetValue(anonymousType, null) as T;
}
添加:
这就是anonymousType到达的方式. GetAnonymousTypeMember方法是一个类的私有方法,其唯一的公共方法声明如下:
public void PublishNotification(NotificationTriggers触发器,对象templateParameters)
我称之为这种方法:
PublishNotification(NotificationTriggers.RequestCreated, new {NewJobCard = model});
新的{NewJobCard = model}是作为anonymousType传递给GetAnonymousTypeMember的内容.
最佳答案
public U GetMemberValue<T, U>(T instance, Expression<Func<T, U>> selector)
{
Type type = typeof(T);
var expr = selector.Body as MemberExpression;
string name = expr.Member.Name;
var prop = type.GetProperty(name);
return (U)prop.GetValue(instance, null);
}
将能够做到:
string name = GetMemberValue(new { Name = "Hello" }, o => o.Name);