以强类型方式使用obect的属性名称

时间:2013-11-13 22:53:25

标签: c# .net reflection

有没有办法(在c#.Net 4.0中)以强类型方式提供对象属性名称? 例如,如果我们有一个对象Person

Public class Person{
    public string Name { get; set; }
    public int Age { get; set; }
    }

我想发送一些其他方法的参数Name,Age属性名称但不是字符串而是强类型:

SomeMethodThatWantToKnowKeys(Person.Name,Person.Age);

我想要实现的是,如果有人更改了属性名称,他将不得不将他发送的属性名称更改为“SomeMethodThatWantToKnowKeys”。 也许反思? 更好的方法是不更新对象itsef或创建它的实例。

2 个答案:

答案 0 :(得分:3)

如果我了解您的需求,可以使用expressions

void SomeMethod<T>(Expression<Func<T>> expr)
{
    var memberExpr = expr.Body as MemberExpression;
    Console.WriteLine("{0}: {1}", memberExpr.Member.Name, expr.Compile()());
}

var person = new { Name = "John Doe", Age = 10 };
SomeMethod(() => person.Name); // prints "Name: John Doe"
SomeMethod(() => person.Age);  // prints "Age: 10"

答案 1 :(得分:3)

好的,虽然有一些丑陋的黑客,但有一个更好,更清晰的解决方案。这个问题是因为抽象没有到位。

什么名字?字符串?它可以是int,double,char,float ......任何东西......你并不真正关心底层类型。你关心名字的概念或概念。我知道这有点深刻,但这种经验将帮助你做好设计。

以下是我现在的建议,但我个人可能会做更多。

public class PersonName
{
    public String Name { get; set; }
}

public class PersonAge
{
    public int Age {get;set;}
}

public class Person
{ 
    public PersonName PersonName {get;set;}
    public PersonAge PersonAge {get;set;}
}

所以现在你的方法签名是:

    SomeMethodThatWantToKnowKeys(PersonName,PersonAge);

类型安全是一件了不起的事情!