C#如何获取类属性的名称(在字符串中)?

时间:2010-11-24 11:53:50

标签: c#

public class TimeZone
{
    public int Id { get; set; }
    public string DisplayName{ get; set; }
}

在其他课程中我:

   var gmtList = new SelectList(
       repository.GetSystemTimeZones(), 
       "Id",
       "DisplayName");

注意:System.Web.Mvc.SelectList

我不喜欢用“Id”和“DisplayName”来编写属性名称。稍后,可能属性名称将更改,编译器将不会检测到此错误。 C#如何在字符串中获取属性名称?

更新1

在Christian Hayter的帮助下, 我可以用:

var tz = new TimeZone();
var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    NameOf(() => tz.Id), 
    NameOf(() => tz.TranslatedName));

OR

var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    NameOf(() => new TimeZone().Id), 
    NameOf(() => new TimeZone().TranslatedName));

如果有人有其他想法而无需创建新对象。随意分享:)谢谢。

5 个答案:

答案 0 :(得分:13)

您可以创建一个实用程序方法,从表达式树中提取属性名称,如下所示:

string NameOf<T>(Expression<Func<T>> expr) {
    return ((MemberExpression) expr.Body).Member.Name;
}

然后你可以这样称呼它:

var gmtList = new SelectList(repository.GetSystemTimeZones(),
    NameOf(() => tz.Id),
    NameOf(() => tz.DisplayName));

请注意,由于您没有读取属性值,因此该类的任何实例都将执行此操作。

答案 1 :(得分:0)

(那些不是参数btw,它们是属性。)

嗯,一个选择是使用委托。例如:

public class SelectList<T>
{
    public SelectList(IEnumerable<T> source,
                      Func<T, string> idProjection,
                      Func<T, string> displayProjection)
    {
        ...
    }
}

然后:

var gmtList = new SelectList<TimeZone>(repository.GetSystemTimeZones(),
                                       tz => tz.Id, tz => tz.DisplayName);

答案 2 :(得分:0)

var name = (string) typeof(TimeZone).GetProperty("DisplayName").GetValue(0);

答案 3 :(得分:0)

string id=typeof(TimeZone).GetProperties()[0].Name;
string displayName=typeof(TimeZone).GetProperties()[1].Name;


var gmtList = new SelectList(
   repository.GetSystemTimeZones(), 
   id,
   displayName);

这将起作用,除非声明的id和displayname的顺序不会改变。  或者您可以考虑为属性定义属性以区分id和displayname。

答案 4 :(得分:0)

从C#6.0开始,您现在可以使用

var gmtList = new SelectList(
    repository.GetSystemTimeZones(), 
    nameof(TimeZone.Id),
    nameof(TimeZone.DisplayName));