如下所示,如何找到一个特定属性的名称?
public class Student
{
public int Grade
{
get;
set;
}
public string TheNameOfTheGradeProperty
{
get
{
return ????
}
}
// More properties..
}
所以我想从TheNameOfTheGradeProperty属性返回字符串“Grade”。我问的原因是我不想使用硬编码字符串,而是使用lambda表达式或其他东西。
我怎样才能实现这个目标?
答案 0 :(得分:2)
可以使用表达式来查找属性的名称,使用可以在任何对象上使用的简单扩展方法...如果需要将其限制为一组对象,则可以应用通用约束在T.希望这有帮助
public class Student
{
public int Grade { get; set;}
public string Name { get; set; }
public string GradePropertyName
{
get { return this.PropertyName(s => s.Grade); }
}
public string NamePropertyName
{
get { return this.PropertyName(s => s.Name); }
}
}
public static class Helper
{
public static string PropertyName<T, TProperty>(this T instance, Expression<Func<T, TProperty>> expression)
{
var property = expression.Body as MemberExpression;
if (property != null)
{
var info = property.Member as PropertyInfo;
if (info != null)
{
return info.Name;
}
}
throw new ArgumentException("Expression is not a property");
}
}
答案 1 :(得分:1)
using System.Reflection;
return typeof(Student).GetProperty("Grade").Name;
但正如你所看到的,你并没有那么远使用反射(以这种方式),因为“等级”字符串仍然是硬编码的,这意味着在这种情况下它对return "Grade"
更有效。
我喜欢做的一件事是创建一个自定义属性并将其添加到成员中。 以下内容可防止您使用硬编码字符串“Grade”。
public class Student {
// TAG MEMBER WITH CUSTOM ATTRIBUTE
[GradeAttribute()]
public int Grade
{
get;
set;
}
public string TheNameOfTheGradeProperty
{
get
{
/* Use Reflection.
Loop over properties of this class and return the
name of the one that is tagged with the
custom attribute of type GradeAttribute.
*/
}
}
// More properties..
}
答案 2 :(得分:1)
你有一个非常奇怪的要求。你是说你想不使用硬编码的字符串,因为如果你重构这个类,你想让TheNameOfTheGradeProperty
保持最新吗?如果是这样,这是一种奇怪的方式:
public class Student
{
public int Grade { get; set; }
public string TheNameOfTheGradeProperty
{
get
{
Expression<Func<int>> gradeExpr = () => this.Grade;
MemberExpression body = gradeExpr.Body as MemberExpression;
return body.Member.Name;
}
}
}