How to get current property name via reflection?

后端 未结 8 725
悲哀的现实
悲哀的现实 2020-12-02 16:54

I would like to get property name when I\'m in it via reflection mechanism. Is it possible?

Update: I have code like this:

    public CarType Car
            


        
相关标签:
8条回答
  • 2020-12-02 17:39

    Way # 1

    var a = nameof(SampleMethod);    //a == SampleMethod
    var b = nameof(SampleVariable);  //b == SampleVariable
    var c = nameof(SampleProperty);  //c == SampleProperty
    

    Way # 2

    MethodBase.GetCurrentMethod().Name; // Name of method in which you call the code
    MethodBase.GetCurrentMethod().Name.Replace("set_", "").Replace("get_", ""); // current Property
    

    Way # 3

    from StackTrace:

    public static class Props
    {
        public static string CurrPropName => 
             (new StackTrace()).GetFrame(1).GetMethod().Name.Replace("set_", "").Replace("get_", "");
    
        public static string CurrMethodName => 
            (new StackTrace()).GetFrame(1).GetMethod().Name;
    }
    

    you just need to call Props.CurrPropName or Props.CurrMethodName


    Way # 4

    Solution for .NET 4.5+:

    public static class Props
    {
        public static string GetCallerName([System.Runtime.CompilerServices.CallerMemberName] String propertyName = "")
        {
             return propertyName;
        }
    }
    

    usgae: Props.GetCallerName();

    0 讨论(0)
  • 2020-12-02 17:50

    Since properties are really just methods you can do this and clean up the get_ returned:

    class Program
        {
            static void Main(string[] args)
            {
                Program p = new Program();
                var x = p.Something;
                Console.ReadLine();
            }
    
            public string Something
            {
                get
                {
                    return MethodBase.GetCurrentMethod().Name;
                }
            }
        }
    

    If you profile the performance you should find MethodBase.GetCurrentMethod() is miles faster than StackFrame. In .NET 1.1 you will also have issues with StackFrame in release mode (from memory I think I found it was 3x faster).

    That said I'm sure the performance issue won't cause too much of a problem- though an interesting discussion on StackFrame slowness can be found here.

    I guess another option if you were concerned about performance would be to create a Visual Studio Intellisense Code Snippet that creates the property for you and also creates a string that corresponds to the property name.

    0 讨论(0)
提交回复
热议问题