代码之家  ›  专栏  ›  技术社区  ›  cfitzarl

列出/检查对象变量?

  •  0
  • cfitzarl  · 技术社区  · 16 年前

    对于我正在处理的ASP.NET MVC项目,我需要检查Linq to SQL类中的位变量是否为真。到目前为止,在检查每个变量是真是假之后,我将字段的值推到一个列表中,并按如下方式返回:

    public List<String> GetVarList() {
        List<String> list = new List<String>();
    
        if (fields.SearchBar) {
            list.Add("SearchBar");
        }
    
        if (fields.SomeField) {
            list.Add("SomeField");
        }
    
        return list;
    }

    对我来说,这似乎不是最快或最简单的方法。

    我想知道是否有可能通过使用for或foreach循环在字符串数组中循环来动态检查变量的值。例如:

    public List<String> GetVarList() {
        String[] array = {"SearchBar", "SomeField"};
        List<String> list = new List<String>();
    
        foreach (String field in array) {
            // Check whether or not the value is true dynamically through the array
        }
    
        return list;
    }

    谢谢你的建议!

    2 回复  |  直到 16 年前
        1
  •  0
  •   Brian Genisio    16 年前

    当然,您可以将反射用于以下内容:

    private bool ValueWasSet(string propertyName)
    {
        var property = fields.GetType().GetProperty(propertyName);
        return (bool)property.GetValue(fields, null);
    }
    
    public List<string> GetVarList()
    {
        return new [] {"SearchBar", "SomeField"}
            .Where(ValueWasSet)
            .ToList();
    }
    

    这是一个非常直接的解决方案,你想做什么,假设你有很多项目要看。

    注意:这不会比您的代码快。你的代码比这快得多…但是,如果你想更动态地做,你必须支付一个轻微的性能价格。

        2
  •  0
  •   Andrea Parodi    16 年前

    您可以使用反射:

    public List<String> GetVarList() {
        String[] array = {"SearchBar", "SomeField"};
        List<String> list = new List<String>();
        var type=fields.GetType();
        foreach (String field in array) {
            var prop=type.GetProperty(field);
            if ((bool)prop.GetValue(fields,null))
                list.Add(field);
        }
    
        return list;
    }
    

    从你的问题不清楚搜索栏、某些字段等是字段还是属性。如果它们是字段,则相应地更改代码(使用getField()而不是getProperty())