按值获取属性的名称

时间:2018-03-11 21:10:21

标签: c# asp.net system.reflection

我宁愿使用Enums,但我需要一种简单的方法来显示字符串。

 public struct OpportunityStatus
    {
        public static string Active { get; } = "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG";
        public static string Lost { get; } = "stat_LOjFr8l9IG0XQ0Wq23d0uiXe3fDEapCW7vsGECZnKy4";
    }

如果我需要在我的代码中获取丢失机会的状态代码而不键入状态代码,这样可以正常工作。它有助于提高可读性,与emum相同。

我怎么反过来呢?如何通过字符串值获取属性名称:

    public static object FindByStatusCode(string statusCode)
    {
        return typeof(LeadStatus)
           .GetProperty("stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG");
    }

应该返回" Active"

3 个答案:

答案 0 :(得分:3)

是的,这可以使用反射,但要注意它可能非常慢......

ioexception-read-failed-socket-might-closed-bluetooth

这将返回具有特定值的静态属性的名称。它要求属性是静态的。

您可以这样称呼它:

    public static string GetPropertyByValue(Type staticClass, string value)
    {
        var typeInfo = staticClass.GetProperties(BindingFlags.Static | BindingFlags.Public)
                                                .Where(p => string.Compare(p.GetValue(null) as string, value) == 0)
                                                .FirstOrDefault();
        return typeInfo?.Name;
    }

var name = GetPropertyByValue(typeof(OpportunityStatus), "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG"); 等于name的位置。

答案 1 :(得分:0)

看起来你正在尝试实施“智能”。枚举。在git hub上查看ardalis。 enter link description here

您也可以将此代码作为NuGet包找到。

答案 2 :(得分:0)

您似乎有一些从字符串值到属性的映射。因此,您还应该使用支持将键映射到值的数据结构。因此,最佳选择是Dictionary

var map = new Dictionary<string, string> { 
    { "Active", "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG" }, 
    { "Lost", "stat_LOjFr8l9IG0XQ0Wq23d0uiXe3fDEapCW7vsGECZnKy4" }
};

现在您可以获取映射到给定值的键:

var name = map.FirstOrDefault(x => x.Value == "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG");

根据您是否需要更频繁地按值获取键,您还可以交换键和值,使"Active"字典中的实际,而不是