在Linq查询中动态选择属性

我在c#中遇到linq查询的一个问题,我的linq查询如下所示

list = (from row in dt.AsEnumerable() select new Perfmon { id = row.Field("id"), counter1 = row.Field("counter"), }).ToList(); 

我有一个perfmon类,它包含属性,如(id,counter1,counter2 ……)现在有超过20个计数器我已经开发了sql查询来根据参数中传递的countername来选择id和counter,例如,如果我已通过counter1然后它将仅选择id,counter1(重命名为counter)

如果我将在这里使用switch case那么它将有20个女巫案例,任何人都可以帮助我如何在linq中动态绑定属性?

提前致谢。

您可以使字典支持Perfmon类,而不是每个属性的字段。 喜欢:

 class Perfmon { private readonly Dictionary _counters = new Dictionary(); public Perfmon(params KeyValuePair[] knownCounters) { foreach (var knownCounter in knownCounters) { SetCounter(knownCounter.Key, knownCounter.Value); } } public void SetCounter(string name, string value) { _counters[name] = value; } protected string GetCounterValue(string name) { if (_counters.ContainsKey(name)) return _counters[name]; else return null; } public string Counter1 { get { return GetCounterValue("Counter1"); } } public string Counter2 { get { return GetCounterValue("Counter2"); } } public string Counter3 { get { return GetCounterValue("Counter3"); } } } 

构造函数在那里,因此您可以在查询中轻松使用它,如:

 var counterName = "Counter2"; list = (from row in dt.AsEnumerable() select new Perfmon(new KeyValuePair(counterName, row.Field("counter"))) { id = row.Field("id") }).ToList(); 

您也可以使用Dynamic Linq 。 本质是解析您的字符串并将其转换为表达式树。 有关详细信息,请参见此处

http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx

我认为您应该查看System.Reflection命名空间。 当然,你想在linq查询中使用它,但是你现在似乎无法做的事情是从类中动态提取字段/属性。

尝试在linq查询之外使用它,然后您将找到将其集成到查询中的方法。