在setter中获取属性名称

Ste*_*ald 24 .net c# reflection properties

我想在ASP.Net应用程序中的回发之间保留一个属性.目前这样做:

public int MyIndex
{
    get
    {
        return (int)Session[ToString() + "MyIndex"];
    }
}
Run Code Online (Sandbox Code Playgroud)

但更喜欢这样的东西:

public int MyIndex
{
    get
    {
        return (int)Session[ToString() + #code_that_returns_property_name#];
    }
}
Run Code Online (Sandbox Code Playgroud)

Setter省略了,但它只是使用相同的字符串将值推送到Session中.有没有办法使用反射,或更好的解决方案?

sis*_*sve 23

public static int Dummy {
    get {
        var propertyName = MethodBase.GetCurrentMethod().Name.Substring(4);
        Console.WriteLine(propertyName);
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 除了其他评论之外,这种方法要慢几百(几千?)倍,反射也不便宜.它可能不是OP的关注点,但任何考虑这样的事情的人都需要注意.(在我的机器上进行简单的测试,反射版本需要71秒才能进行10000000次呼叫,硬编码版本需要0.8秒) (6认同)
  • 为了上帝的爱,不!结果是比它取代的结果长五倍,并且模糊了100倍!除非你不断改变自己对所谓的财产的看法,否则这是一个荒谬的想法.(... 恕我直言) (5认同)
  • 请参阅我使用 CallerMemberName 处理速度问题的答案。 (2认同)

Bri*_*ice 14

使用CallerMemberName要快得多,并且可以轻松复制和粘贴其他属性.

private static object GetSessionValue([CallerMemberName]string propertyName = "") 
{
    return Session[propertyName];
}

private static void SetSessionValue(object value, [CallerMemberName]string propertyName = "") 
{
    Session[propertyName] = value;
}

public int MyIndex
{
    get { return (int)GetSessionValue(); }
    set { SetSessionValue(value); }
}
Run Code Online (Sandbox Code Playgroud)


And*_*are 12

不,没有一种简单的方法可以做你想做的事.我认为你已经编写的代码好得多.

编辑: 这个答案收到了不少赞成票,我明白为什么.虽然可以做OP想要做的事情,但也许我们应该停下来思考是否这样做是可取的.用Ian Malcom博士的不朽言辞来解释,仅仅因为你能做某事并不意味着你应该这样做.


Jud*_*ngo 7

您可以使用MethodInfo.GetCurrentMethod().Name返回当前方法的名称:

public int MyIndex
{
    get
    {
        return (int)Session[ToString() + MethodInfo.GetCurrentMethod().Name];
    }
}
Run Code Online (Sandbox Code Playgroud)

由于属性是作为引擎下的方法实现的,因此将返回名称"get_MyIndex".如果你不想要"get_"部分,你可以将几个字符子串:

public int MyIndex
{
    get
    {
        return (int)Session[ToString() + MethodInfo.GetCurrentMethod().Name.Substring(4)];
    }
}
Run Code Online (Sandbox Code Playgroud)