基本上,我想要做的是遍历类的属性列表,并且它们是特定类型的地方,我将检查该拥有属性的属性,然后将另一个属性设置为true。
我编写了下面的代码来说明我想要做什么,但它不会编译,因为它说不能将类型System.Reflection.PropertyInfo转换为类型ThermodynamicState。另外,它给出了一个警告,即给定的表达式永远不会是ThermodynamicState类型。
如何将属性列表中的每个属性转换为该类型的对象?
public void BasisChanged()
{
foreach (ThermodynamicProperty thermoProperty in this.GetType().GetProperties().Where(p => p.PropertyType is ThermodynamicProperty && !((ThermodynamicProperty)p.PropertyType).IsBasis))
{
thermoProperty.BasisChanged = true;
}
}
答案 0 :(得分:1)
我相信,你正在尝试以下内容:
public void BasisChanged()
{
foreach (var p in GetType().GetProperties().Where(p => typeof(ThermodynamicProperty).IsAssignableFrom(p.PropertyType)))
{
var value = (ThermodynamicProperty)p.GetValue(this);
if (!value.IsBasis)
value.BasisChanged = true;
}
}
您必须通过PropertyType
检查酒店的类型。 IsAssignableFrom()
检查是否可以将此类型的对象分配给ThermodynamicProperty
变量。然后使用GetValue()
获取当前对象并设置BasisChanged
属性。
请注意,这假设ThermodynamicProperty
是引用类型。如果是值类型,则必须在更改后将其设置回来。
答案 1 :(得分:1)
foreach (PropertyInfo p in this.GetType().GetProperties().Where(p => p.PropertyType == typeof(ThermodynamicProperty)))
{
ThermodynamicProperty propertyObject = (ThermodynamicProperty)p.GetValue(this);
if (!propertyObject.IsBasis)
{
propertyObject.BasisChanged = true;
}
}