c# - 方法名称的预定义宏

标签 c# asp.net webforms c-preprocessor

在 C++ 中有预定义的宏,例如 __FUNCTION__,它会编译为使用宏的函数名称的字符串文字。

void MyFunc()
{
    printf("I'm in %s!", __FUNCTION__); // I'm in MyFunc!
}

C# 有类似的东西吗?我希望为 asp.net 网络表单执行此操作:

public string MyProperty
{
    get { return (string)ViewState[__PROPERTY__]; }
    set { ViewState[__PROPERTY__] = value; }
}

显然这行不通(否则我不会问这个问题),我想知道 C# 中是否有类似的东西不使用反射或与使用字符串文字相比有任何负面的性能影响 “我的属性(property)”

这有望减少我这边的拼写错误,但我可以想到其他一些有用的例子。

最佳答案

C# 的预处理器不支持像 C++ 这样具有关联值的宏,但是您尝试做的事情可以通过编译器生成的支持 C# 5.0 和更高版本(至少是 VS2012+)的编译器来完成 Caller Information .具体来说,通过 System.Runtime.CompilerServices 命名空间中的 CallerMemberNameAttribute。根据您问题的代码,我创建了以下示例来说明您可以如何着手做您想做的事情:

using System;

class ViewState
{
    public string this[string propertyName]
    {
        get { return propertyName; }
        set { }
    }
};
class View
{
    ViewState mState = new ViewState();

    static string GetCallerName(
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "")
    {
        return memberName;
    }

    public string MyProperty
    {
        get { return (string)mState[GetCallerName()]; }
        set { mState[GetCallerName()] = value; }
    }
};
class Program
{
    static void Main(string[] args)
    {
        var view = new View();
        Console.WriteLine(view.MyProperty);

        Console.ReadKey();
    }
};

“MyProperty”将打印到控制台。编译时,编译器会将 GetCallerName 的 memberName 参数的默认值替换为调用构造的(属性、方法等)名称。所以程序员不需要代码维护

还应该注意的是,只要它们发生在编译后,这还有一个额外的好处,那就是可以很好地使用混淆工具。

关于c# - 方法名称的预定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160049/

相关文章:

c# - Elasticsearch 中更新了文档ID

c# - WPF - ListView 内的 ListView 滚动条问题

asp.net - ASP.NET Web 窗体是否会阻止双击提交?

C# 运算符重载、重写字符串?

c# - Linq 到 SQL : WHERE IN statement

c# - 无法解析 Web Api Controller 中的依赖项

asp.net - ASP :RadioButtonList and jQuery to show hide a panel

html - Safari 和 Chrome 的下拉菜单大小不同

c# - 停止向外部发布到 Asp.Net WebForm 页面的能力

c# - 如何使折线图中的数据点可见?