c# – 如何避免使用字符串成员名称来获取匿名类型的成员?

我正在使用以下代码从匿名类型中检索命名成员.有没有什么方法可以转换后续代码使用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);
点赞