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时的易用性。之后您将如何处理该属性?