通过值得到一个属性的名字

Get the name of a property by the value

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

 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");
    }

应该return"Active"

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

    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;
    }

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

你可以这样称呼它:

var name = GetPropertyByValue(typeof(OpportunityStatus), "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG");

其中 name 等于 Active

您似乎正在尝试实施 'smart' 枚举。在 git 集线器上查看 ardalis。 enter link description here

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

您似乎有一些从 string-value 到 属性 的映射。因此,您还应该使用支持将键映射到值的 data-structure。因此,最好的选择是 Dictionary:

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

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

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

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