如何使用表达式和/或反射获取常量名称?

Posted

技术标签:

【中文标题】如何使用表达式和/或反射获取常量名称?【英文标题】:How to get a Constant Name using Expressions and/or reflection? 【发布时间】:2013-10-10 06:35:41 【问题描述】:

我写了下面的但“我”总是为空?

 public static class Test1
    
        public const string CampaignManager = "This_CAMPAIGN_MANAGER";
    

 public static class ReflectionHelper
    
        // <summary>
        // Get the name of a static or instance property from a property access lambda.
        // </summary>
        // <typeparam name="T">Type of the property</typeparam>
        // <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
        // <returns>The name of the property</returns>
        public static string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
        
            var me = propertyLambda.Body as MemberExpression;

            if (me == null)
            
                throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
            

            return me.Member.Name;
        
    

var campaignManager = ReflectionHelper.GetPropertyName(() => Test1.CampaignManager);

【问题讨论】:

看看this也许能帮上忙。 这就是你需要的:***.com/questions/34304756/… 你传递的是属性的值而不是属性本身 【参考方案1】:

您不能在反射助手中使用 const 字段,因为 lambda 表达式的主体是 ConstantExpression 而不是 MemberExpression。 替换

 public const string CampaignManager = "This_CAMPAIGN_MANAGER";

 public static string CampaignManager = "This_CAMPAIGN_MANAGER";

【讨论】:

但常量应该是常量) @SalientBrain Ups,我的错。那么,我认为这是不可能的。 然而资源是静态的,但经常使用【参考方案2】:

似乎你无法获得常量名称,因为

ReflectionHelper.GetPropertyName(() => Test1.CampaignManager);

变成

ReflectionHelper.GetPropertyName(() => "This_CAMPAIGN_MANAGER");

编译器

【讨论】:

以上是关于如何使用表达式和/或反射获取常量名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过反射获取静态常量类中的各个值

如何在 C# 中使用反射获取类型的完全限定名称

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

c#中的静态变量,怎么通过反射的方式获取指定变量名称的值呢?比如说一个const类型的常量:con

如何使用 Go 反射 pkg 获取切片结构字段的类型?

使用反射获取 T 的类型名称