【问题标题】:how to search an obj for a variable, given variable name as string [duplicate]如何在obj中搜索变量,给定变量名作为字符串[重复]
【发布时间】:2015-02-11 02:52:56
【问题描述】:

我有一个很大的对象列表,对象包含字符串名称、字符串地址、字符串城市等内容。

我想创建一个像这样的 findEqualsMatch 方法。它接受一个名为 varName 的字符串,然后搜索调用 varName 的对象的变量。

这样,如果我执行 data.FindEquals("name", "tom") 它会搜索对象“name”属性等于 tom,同时您可以编写“address”,它会搜索地址属性。

public List<Datum> FindEquals(String varName, String value)
            {
                List<Datum> results = new List<Datum>();
                foreach (Datum result in data)
                {
                    //should search for address variable
                    // instead of if(result.Address == value)

                    if (result.varName == value)
                        results.Add(result);

                }

                return results;
            }

List<Datum> newResults = data.FindEquals("address", "123 street");

整个目的是查询一组实际的 API 结果并返回一个由您插入到函数中的任何变量类型搜索的集合。

【问题讨论】:

  • 您在寻找什么?值还是 varName?
  • 我正在从对象内部的 varName 中搜索变量的值...这是否清楚?这样,如果我执行 data.FindEquals("name", "tom") 它会搜索对象“name”属性等于 tom,同时您可以编写“address”,它将搜索地址属性。
  • 您必须使用反射(见下文),或者更好/更快/类型安全的是将String varName 替换为匹配器委托。

标签: c# linq factual


【解决方案1】:

您可以使用reflection。从Get property value from string using reflection in C# 开始,您的示例将如下所示:

public List<Datum> FindEquals(String varName, String value)
        {
            List<Datum> results = new List<Datum>();
            var propertyInfo = (typeof Datum).GetProperty(varName);
            foreach (Datum result in data)
            {
                String varValue = (string)propertyInfo.GetValue(result, null);
                if (varValue == value)
                    results.Add(result);
            }
            return results;
        }

或者,您可以使用 Func&lt;string, Datum&gt; 作为字段访问器参数或类似于 LINQ-to-SQL 的相应表达式树(即 Get the property name used in a Lambda Expression in .NET 3.5

【讨论】:

  • 天才感谢,解决了我需要访问 varName 的问题,在前面的示例中无法做到这一点。
  • 没问题。如果有帮助,您应该将我的问题标记为答案。
  • 我从我的(已删除)答案中添加了替代方法,因为我将整个问题标记为反射调用的副本。随时恢复/改进。
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多