如何比较反射到类型的属性?

时间:2016-05-04 14:10:07

标签: c# reflection

基本上,我想要做的是遍历类的属性列表,并且它们是特定类型的地方,我将检查该拥有属性的属性,然后将另一个属性设置为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;
        }
    }

2 个答案:

答案 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;
     }
}
相关问题