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

时间:2010-08-03 09:28:21

标签: c# .net

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

new {NewJobCard = model}GetAnonymousTypeMember传递给anonymousType

4 个答案:

答案 0 :(得分:1)

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);

答案 1 :(得分:1)

但为什么不用动态?例如:

class MyClass
{
  public int member = 123;
}

class Program
{
  static void Main(string[] args)
  {
    MyClass obj = new MyClass();

    dynamic dynObj = obj;
    Console.WriteLine(dynObj.member);

    Console.ReadKey();
  }
}

您还可以参与ExpandoObject

List<dynamic> objs = new List<dynamic>();

dynamic objA = new ExpandoObject();
objA.member = "marian";
objs.Add(objA);

dynamic objB = new ExpandoObject();
objB.member = 123;
objs.Add(objB);

dynamic objC = new ExpandoObject();
objC.member = Guid.NewGuid();
objs.Add(objC);

foreach (dynamic obj in objs)
  Console.WriteLine(obj.member);

Console.ReadKey();

答案 2 :(得分:0)

不,当您将对象作为类型object发送时,参数没有特定的类型信息。如果要访问对象的成员,则需要使用反射从对象本身获取类型信息。

使用lambda表达式来获取成员会起作用,但这完全没有意义......

答案 3 :(得分:0)

你的意思是这样的吗?

private R GetAnonymousTypeMember<T, R>(T anonymousType, Expression<Func<T, R>> e) where T : class
{
    return e.Compile()(anonymousType);
}

public void Do()
{
    var x = new {S = "1", V = 2};
    var v = GetAnonymousTypeMember(x, _ => _.V);
}