有没有办法(在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或创建它的实例。
答案 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);
类型安全是一件了不起的事情!