2010-10-13 45 views
1

孔加入nameof到C#,我并不孤单谁是生病被不断地只是用来做数据绑定神奇的字符串 - 参见:通过后门

How to make Databinding type safe and support refactoring

但是我关心的性能这个解决方案和更多的输入 - 每次你想使用nameof你必须输入一个lambda。所以我想到了更强大的方法 - 编写一个函数nameof和外部程序,它会在编译之前更改每个.cs文件。

public string nameof<T>(T obj,string name = null) 
{ 
    return name; 
} 

你会使用这种方式

nameof(the_object.MyProperty); 

关键在于外部程序帮助nameof - 它会搜索nameof的任何号召,只需更换

nameof(X.Y.Z) 

nameof(X.Y.Z,"s") 

in到

nameof(X.Y.Z,"Z") 

我的问题是 - 什么限制,这种方法的缺陷你看?或者,也许.Net 5.0内置nameof将在下周发布,所以开始为它编写程序是没有意义的? ;-)

预先感谢您的想法,建议等。

+1

如果你想在5.0这个功能,不要屏住呼吸,它可能不会发生...看到[这篇文章](http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx)的原因。 (但我同意它会非常方便,至少对于属性,如果不是方法) – 2010-10-13 08:10:12

回答

3

做任何预编译代码更改将是一个极端的麻烦。所以我会避免它。

我不会太担心性能 - 大多数情况下,当你需要一个属性名称作为字符串时,你最终会做反射或IO,所以无论如何性能会相对较慢。

这里就是我建议使用:

public static string ToPropertyName<T>(this Expression<Func<T>> @this) 
{ 
    var @return = string.Empty; 
    if (@this != null) 
    { 
     var memberExpression = @this.Body as MemberExpression; 
     if (memberExpression != null) 
     { 
      @return = memberExpression.Member.Name; 
     } 
    } 
    return @return; 
} 

现在你可以这样做:

Expression<Func<T>> px = x => x.Foo; 
var pn = px.ToPropertyName(); // == "Foo" 
+1

这是@return表示法?我从来没有见过这个。 – Alex 2010-10-13 07:15:01

+2

@Alex:这是混淆其他程序员。它允许您使用关键字作为变量名称。 – Henrik 2010-10-13 07:35:41

+0

感谢您指出性能问题。现在我正考虑为每个需要名称的属性放置一个名称为静态只读属性的名称,这样,名称就会被评估一次。 – greenoldman 2010-10-13 07:42:52