【发布时间】:2015-10-06 16:01:05
【问题描述】:
我有一个名为Part 的基类和Wire 或Connector 等派生类,还有更多继承自Part 的类。
现在我想实现一个搜索函数,在派生类的所有属性中搜索字符串。
如有必要,应尝试将该字符串转换为属性的类型。属性也可以是列表,应该在第一级搜索。
class Part
{
public int Id { get; set; }
public string Name { get; set; }
}
class Wire : Part
{
public NumberWithUnit Diameter { get; set; }
public Weight Weight { get; set; }
}
class Connector : Part
{
public List<Part> ConnectedParts { get; set; }
}
我知道如何通过这样的反射来搜索基本类型的属性
private bool SearchProperties<T>(T part, string searchString) where T : Part
{
var props = typeof(T).GetProperties();
foreach (var prop in props)
{
var value = prop.GetValue(part);
if (value is string)
{
if (string.Equals(value, searchString))
return true;
}
else if (value is int)
{
int v;
if (int.TryParse(searchString, out v))
{
if(v == (int) value)
return true;
}
}
}
return false;
}
但这将是一长串类型,例如,我有类型为 Weight 的属性等等。是否有某种通用的搜索方式而不需要转换所有类型?
【问题讨论】:
-
可能有点笨拙,但我认为像
IStringSearchable这样的非原始类型的接口定义会有所帮助。可能有一个更好的解决方案,但不需要触及每个班级。 -
如果被检查的对象包含复杂类型的属性,你的意思是也要检查它的属性吗?我问是因为在问题中您使用的是“派生类的所有属性”这一短语。
-
派生类是指从
Part继承的所有类。但是对于复杂类型,最好检查一下它的所有属性,但仅限于此。
标签: c# search reflection