给定此接口:
public interface IToken
{
int ID { get; }
string Name { get; }
string Description { get; }
string Type { get; }
string Category { get; }
}
假设我有一个IEnumerable<IToken>
约有200名成员的成员,它是通过从各种文件中读取JSON来构造的。为了测试它,我创建了一个ConsoleApplication项目,并且尝试通过LINQ来成功地操作集合。
我想做的是从控制台接收输入,并通过我设计的命令对其进行处理:
exit
list token
list token filter [filterType] [filterValue]
因此,如果我只输入list token
,它将迭代列表并输出所有成员。简单。
如果我键入会出现问题list token filter Category "SomeCategory"
(它应该IToken
在集合中选择的所有对象Category == "SomeCategory"
);我不知道如何编程它,以将用户提供的字符串映射[filterType]
到名为的对象属性Category
(或IToken上可能存在或可能不存在的其他属性),除非我为每种情况都进行了硬编码。对我来说,这太费力了,而且扩展性不好。
这样做的最佳方法是什么?
现在,我的代码是:
private void Input_ListTokens(string filterType, string filterValue)
{
IEnumerable<string> result = null;
if (String.IsNullOrWhiteSpace(filterType) || String.IsNullOrWhiteSpace(filterValue))
{
result = from t in Tokens
select t.ToString();
}
else
{
if (filterType == "type")
result = from t in Tokens
where t.Type == filterValue
select t.ToString();
if (filterType == "category")
result = from t in Tokens
where t.Category == filterValue
select t.ToString();
}
if (result != null)
foreach (var item in result)
c.WriteLine(item);
c.WriteLine();
}
如您所见,两个LINQ查询之间唯一的区别是
where t.Type == filterValue
where t.Category == filterValue
private void Input_ListTokens(string filterType, string filterValue)
{
IEnumerable<string> result = null;
Type t = typeof(IToken);
PropertyInfo f = t.GetProperty(filterType);
if (f!=null)
result = from t in Tokens
where t.GetValue(t)== filterValue
select t.ToString();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句