Получить имя свойства по значению

Я бы предпочел использовать 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");
    }

Должен вернуть "Активный"


person prospector    schedule 11.03.2018    source источник
comment
Вам нужно будет реализовать какую-то схему сопоставления строковых значений со свойством.   -  person Mark Benningfield    schedule 12.03.2018
comment
Я думаю, что ваша логика как-то нарушена. Вместо двух свойств, почему бы не использовать Dictionary? Зачем тебе вообще имя собственности? Что вы хотите с этим делать?   -  person HimBromBeere    schedule 12.03.2018
comment
Было бы действительно полезно, если бы вы объяснили, почему вы хотите это сделать.   -  person Dour High Arch    schedule 12.03.2018
comment
@HimBromBeere, потому что здесь десятки свойств, а не два. Мне нужна была читабельность кода и такая же простота использования, как при использовании Enum.   -  person prospector    schedule 12.03.2018
comment
что вы делаете с имуществом потом?   -  person HimBromBeere    schedule 12.03.2018


Ответы (3)


Да, это возможно с использованием отражения, но имейте в виду, что это может быть очень медленно...

    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 будет равно Active.

person Ron Beyer    schedule 11.03.2018

Похоже, вы пытаетесь реализовать «умное» перечисление. Проверьте ardalis на git hub. введите здесь описание ссылки

Вы также можете найти этот код в виде пакета NuGet.

person torsan    schedule 11.03.2018

Кажется, у вас есть некоторое сопоставление строкового значения со свойством. Таким образом, вы также должны использовать структуру данных, которая поддерживает сопоставление ключей со значениями. Таким образом, лучший вариант - это Dictionary:

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

Теперь вы можете получить ключ, который соответствует заданному значению:

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

В зависимости от того, нужно ли вам чаще получать ключи по значениям, вы также можете поменять местами ключ и значение, сделав "Active" фактическим значением в словаре, а не ключом.

person HimBromBeere    schedule 11.03.2018