当前位置:  开发笔记 > 编程语言 > 正文

针对类型安全数据绑定缺少C#中"nameof"运算符的解决方法?

如何解决《针对类型安全数据绑定缺少C#中"nameof"运算符的解决方法?》经验,为你挑选了2个好方法。

nameof在C#中包含运算符的情绪很多.作为此运算符如何工作的示例,nameof(Customer.Name)将返回字符串"Name".

我有一个域对象.我必须绑定它.然后我需要属性的名称作为字符串.我希望它们是类型安全的.

我记得在.NET 3.5中遇到过一种解决方法,它提供了nameoflambda表达式的功能和涉及的lambda表达式.但是,我无法找到此解决方法.任何人都可以为我提供这种解决方法吗?

我也对nameof如果可能的话在.NET 2.0中实现功能的方法感兴趣.



1> reshefm..:

这段代码基本上是这样的:

class Program
{
    static void Main()
    {
        var propName = Nameof.Property(e => e.Name);

        Console.WriteLine(propName);
    }
}

public class Nameof
{
    public static string Property(Expression> expression)
    {
        var body = expression.Body as MemberExpression;
        if(body == null)
            throw new ArgumentException("'expression' should be a member expression");
        return body.Member.Name;
    }
}

(当然是3.5代码...)


请注意,性能下降.表达式对象的创建成本非常高.调用`Foo(Expression >)`比旧式的`Foo(string propName)`慢200倍.请投票给[编译时运营商名称](http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2427047-add-nameof-operator-in-c-).

2> Judah Gabrie..:

虽然reshefm和Jon Skeet使用表达式显示了正确的方法,但值得注意的是,为方法名称执行此操作的方法更便宜:

绕过你的方法包装一个委托,得到MethodInfo,你就可以了.这是一个例子:

private void FuncPoo()
{
}

...

// Get the name of the function
string funcName = new Action(FuncPoo).Method.Name;

不幸的是,这只适用于方法; 它不适用于属性,因为您不能拥有属性getter或setter方法的委托.(看起来像一个愚蠢的限制,IMO.)

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有