Mat*_*hew 4 c# asp.net webforms c-preprocessor
在C++中有预定义的宏,例如__FUNCTION__,编译为使用宏的函数名的字符串文字.
void MyFunc()
{
    printf("I'm in %s!", __FUNCTION__); // I'm in MyFunc!
}
Run Code Online (Sandbox Code Playgroud)
C#有什么类似的东西吗?我希望为asp.net Web表单执行此操作:
public string MyProperty
{
    get { return (string)ViewState[__PROPERTY__]; }
    set { ViewState[__PROPERTY__] = value; }
}
Run Code Online (Sandbox Code Playgroud)
显然这不起作用(否则我不会问这个问题),我想知道C#中是否有类似的东西不使用反射或者使用字符串文字会产生任何负面的性能影响"MyProperty".
这有望减少我的拼写错误,但我可以想到其他一些有用的实例.
C#的预处理器不支持带有像C++这样的关联值的宏,但是你要做的事情可以通过编译器生成的调用者信息来支持C#5.0及更高版本(至少VS2012 +)的编译器.具体而言,经由CallerMemberNameAttribute从System.Runtime.CompilerServices命名空间.根据您的问题代码,我创建了以下示例来说明如何执行您想要执行的操作:
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();
    }
};
Run Code Online (Sandbox Code Playgroud)
"MyProperty"将打印到控制台.编译时,编译器将使用调用构造的(属性,方法等)名称替换GetCallerName的memberName参数的默认值.因此程序员不需要代码维护
还应该注意的是,只要它们在编译后发生,这具有能够与混淆工具一起使用的额外好处.
您可以使用StackTrace 和 StackFrame来获取当前方法的名称
StackTrace st = new StackTrace(); 
StackFrame sf = st.GetFrame(1);
string method = sf.GetMethod().ToString();
Run Code Online (Sandbox Code Playgroud)
对于属性,返回的方法名称将包含 magicget_或set_前缀。
但是,我认为您不能像在 C++ 中那样将其真正重构为内联宏或函数。但是,如果您确实重构了一个实用程序方法来干燥它,您可能只需将 StackTrace 后退一步来记录调用者的信息?