C# 按名称选择类字段,就像它是字典一样?

C# 按名称选择类字段,就像它是字典一样?,c#,C#,我有一个函数,它通过选择的字段过滤特定类的对象。目前我这样做的方式是将一个命名字段的字符串作为参数传递给函数。理想情况下,我希望能够使用此字符串选择对象中的字段,类似于字典(例如javascript中存在此功能) 因此,我在这里有一个函数(减少到相关位): 如果有帮助的话,下面是类(本质上只是一个结构): 公共类HangingArtBundle { 公共字符串CP{get;set;} 公共字符串标题{get;set;} 公共字符串类别{get;set;} 公共字符串AUToolTab{get;s

我有一个函数,它通过选择的字段过滤特定类的对象。目前我这样做的方式是将一个命名字段的字符串作为参数传递给函数。理想情况下,我希望能够使用此字符串选择对象中的字段,类似于字典(例如javascript中存在此功能)

因此,我在这里有一个函数(减少到相关位):

如果有帮助的话,下面是类(本质上只是一个结构):

公共类HangingArtBundle
{
公共字符串CP{get;set;}
公共字符串标题{get;set;}
公共字符串类别{get;set;}
公共字符串AUToolTab{get;set;}
公共列表艺术{get;set;}
}

在C#中是否可以优雅地实现这一点?

您可以使用
System.Reflection
来实现这一点

 private string GetField(HangingArtBundle hab, string property)
 {
    return (string)hab.GetType().GetProperty(property).GetValue(hab, null);
 }

或者是一种让生活更轻松的扩展方法:

    public static class Extensions
    {
        public static string GetField(this HangingArtBundle hab, string property)
        {
            if (hab.GetType().GetProperties().Any(p => p.Name.Equals(property)))
            {
                return (string)hab.GetType().GetProperty(property).GetValue(hab, null);
            }
            return string.Empty;
        }
    }
用法:

  string result = bundle.GetField("CP");

在这里,反射可能是一个显而易见的答案,但我更关心的是这段代码实际上要实现什么。看起来您并不真的需要反射或元编程构造。看起来更像是要过滤属性具有特定值的对象集合。如果是这样的话,我的建议是将其重构为更清晰的代码,而不是尝试使用反射提取一些奇怪的代码。只有我的两个cents@ErOx我有一个可以通过API访问的这些HangingArtBundle的缓存,它有“GetAllHangingArtByCategory”和“GetAllHangingArtByAUToolTab”这样的方法,除了过滤字段之外,它们的主体是相同的。所以我编写了GetAllHangingArtByX函数的通用版本,这就引出了这个问题。我想一个更干净的解决方案是更改数据存储的格式,但我选择了这种类似结构的设置,以最干净地模拟嵌套的JSON结构-这些结果最终将序列化到该结构。添加了一个扩展方法示例,以防您更容易使用。:)
 private string GetField(HangingArtBundle hab, string property)
 {
    return (string)hab.GetType().GetProperty(property).GetValue(hab, null);
 }
    public static class Extensions
    {
        public static string GetField(this HangingArtBundle hab, string property)
        {
            if (hab.GetType().GetProperties().Any(p => p.Name.Equals(property)))
            {
                return (string)hab.GetType().GetProperty(property).GetValue(hab, null);
            }
            return string.Empty;
        }
    }
  string result = bundle.GetField("CP");