【问题标题】:Deep search within a multidimensional object [closed]多维对象内的深度搜索[关闭]
【发布时间】:2013-01-08 20:19:53
【问题描述】:

我有一个复杂的类,它的字段可以是列表字典和任何其他类。一些基本数据类型是intboolstring 或一些枚举。我需要创建一个函数,该函数接受该类的一个实例和一个字符串,并根据是否提到字符串返回 true 或 false。

public class Record
  {
    public Dictionary<string,int> Counts { get; set; }
    public Dictionary<string,list<string>> Syns {get; set;}
    public string Name { get; set; }
    public KeyValuePair<string,KeyValuePair<string,bool>> Stuff { get; set; }
    //etc 
  }

这是该方法应该做的事情

   public static bool IsValuePresent(Object o, string keyword)
     {
       //cycle through all possible string values of o and check if keyword is present. 
       //return true if so, otherwise false
     } 

可能的调用:

 Record record = dbAccess.GetCurrent();
 bool flag = IsValuePresent(record, "Name");

备注:可以使用ToJSON,但这将验证"name"是否存在于对象属性的名称中,但它应该只验证值。

【问题讨论】:

  • 您的代码不会按照所写的那样编译 - 请发布“记录”的真实代码,或者至少是一个工作示例...

标签: c#


【解决方案1】:

您应该能够使用递归并使用 System.Reflection。这是一篇好文章:

Reflection - Iterate object's properties recursively within my own assemblies (Vb.Net/3.5)

看看:

foreach (PropertyInfo pi in o.GetType().GetProperties())

【讨论】:

  • 我使用了这两个,但它不适用于复杂的属性,如list 或“字典”。不过还是谢谢你。
  • 我只是更仔细地检查了您的评论。是的,如果我不想使用 JSON,我需要做的就是递归。有没有快速的方法?
【解决方案2】:

对不起,如果我误解了,但我认为您需要先引用您班级中的字段

record-&gt;field1record.field1(用于静态分配的类)

我假设这些字段是一个字典类,因此您可以使用其中一种字典类方法来定位您的字符串。

record->field1.getindex("Name") 

然后,您可以将整个过程包装在您的方法中,并使其成为记录类中的方法或使其成为外部方法。下面我使用内部方法。

template <class T>
bool Record :: IsValuePresent(T listobject, string in) {

switch (typeof(listobject))
{
   case 'dictionary'
     if(record->field1.getindex(in) != -1)  // -1 meaning not present in this example
     {
       return false;
     } else return true;
   case 'list'
    // more code
   default: 
     return false;
}

}

编译器应该优化上述方法。

【讨论】:

  • 它们并不都是 Dictionary 类,有些可能是列表、数组,甚至是其他类。我事先不知道Record的结构。我需要能够在运行 IsValuePresent 时发现它。
  • 然后你可以添加一个使用typeid( )的case switch语句(到IsValuePresent方法中)。我更新了上面的代码。
  • 抱歉,我使用了 C++ 运算符。对于 C#,您可以使用 typeof(MyObject).GetProperties()
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 2017-10-19
  • 2016-05-11
  • 2011-07-18
  • 1970-01-01
  • 2018-09-24
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多