Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过值获取属性的名称_C#_Asp.net_System.reflection - Fatal编程技术网

C# 通过值获取属性的名称

C# 通过值获取属性的名称,c#,asp.net,system.reflection,C#,Asp.net,System.reflection,我宁愿使用枚举,但我需要一种显示字符串的简单方法 public struct OpportunityStatus { public static string Active { get; } = "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG"; public static string Lost { get; } = "stat_LOjFr8l9IG0XQ0Wq23d0uiXe3fDEapCW7vsG

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

 public struct OpportunityStatus
    {
        public static string Active { get; } = "stat_WWuMrC5QlVlr7geYuxDStp5BfrEtfl63H8JaQoIdYAG";
        public static string Lost { get; } = "stat_LOjFr8l9IG0XQ0Wq23d0uiXe3fDEapCW7vsGECZnKy4";
    }
如果我需要在代码中获取丢失的opportunity的状态代码,而不需要键入状态代码,则此操作非常有效。和emum一样,它有助于提高可读性

但是,我如何反向操作呢?如何通过字符串值获取属性名称:

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

应该返回“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;
    }
这将返回具有特定值的静态属性的名称。它要求属性是静态的

你可以这样称呼它:

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

其中
name
将等于
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;
    }
这将返回具有特定值的静态属性的名称。它要求属性是静态的

你可以这样称呼它:

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

其中
name
将等于
Active

看起来您正在尝试实现“智能”枚举。查看git hub上的ardalis


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

看起来您正在尝试实现“智能”枚举。查看git hub上的ardalis


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

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

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

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

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

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

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

您必须实现某种从字符串值到属性的映射方案。我认为您的逻辑在某种程度上被破坏了。为什么不使用
字典
,而不是两个属性呢?你为什么会喜欢这个名字?你想用它做什么?如果你买了它会很有帮助的,因为这里有几十处房产,而不是两处。我希望代码可读性和使用Enum时的易用性。之后您将如何处理属性?您必须实现某种从字符串值到属性的映射方案。我认为您的逻辑不知何故被破坏了。为什么不使用
字典
,而不是两个属性呢?你为什么会喜欢这个名字?你想用它做什么?如果你买了它会很有帮助的,因为这里有几十处房产,而不是两处。我希望代码可读性和使用Enum时的易用性。之后您将如何处理该属性?