我正在寻找一种方法将属性本身传递给函数,而不是属性的值。函数事先不知道哪个属性将用于排序。在这个例子中,最简单的方法是:创建4个具有不同参数类型的重载。另一种方法是在函数内部使用 typeof()
。但当 Class1 拥有数百个属性时,这些方法都无法接受。到目前为止,我找到了以下方法:
class Class1
{
string vehName;
int maxSpeed;
int fuelCapacity;
bool isFlying;
}
class Processor
{
List<Class1> vehicles = null;
Processor(List<Class1> input)
{
vehicles = input;
}
List<Class1> sortBy(List<Class1> toSort, string propName)
{
if (toSort != null && toSort.Count > 0)
{
return toSort.OrderBy(x => typeof(Class1).GetProperty(propName).GetValue(x, null)).ToList();
}
else return null;
}
}
class OuterUser
{
List<Class1> vehicles = new List<Class1>();
// ... fill the list
Processor pr = new Processor(vehicles);
List<Class1> sorted = pr.sortBy("maxSpeed");
}
我不喜欢这种方法,因为将字符串传递给处理函数时存在"人为错误"的风险。当字符串由代码的其他部分生成时,情况会变得更加丑陋。 请建议更优雅的方式来实现将Class1属性传递给函数进行进一步处理。在我看来,最好的选项是(或类似于此):
vehicles = sortBy(vehicles, Class1.maxSpeed);