Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将反射的属性与类型进行比较?_C#_Reflection - Fatal编程技术网

C# 如何将反射的属性与类型进行比较?

C# 如何将反射的属性与类型进行比较?,c#,reflection,C#,Reflection,基本上,我要做的是循环一个类上的属性列表,如果它们是特定类型,我将检查该拥有属性的一个属性,然后将另一个属性设置为true 我写了下面的代码来说明我想做什么,但是它不会编译,因为它说不能将System.Reflection.PropertyInfo类型转换为ThermodynamicState类型。此外,它还发出警告,指出给定的表达式永远不是ThermodynamicState类型 如何将反射提供的属性列表中的每个属性转换为该类型的对象 public void BasisChanged(

基本上,我要做的是循环一个类上的属性列表,如果它们是特定类型,我将检查该拥有属性的一个属性,然后将另一个属性设置为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;
        }
    }

我相信,您正在尝试以下内容:

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
属性


请注意,这假定
热动力学属性
为参考类型。如果它是值类型,您必须在更改后将其设置回原来的值。

我相信,您正在尝试以下操作:

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;
    }
}
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;
     }
}
您必须通过
PropertyType
检查属性的类型
IsAssignableFrom()
检查是否可以将此类型的对象分配给
ThermodynamicProperty
变量。然后使用
GetValue()
获取当前对象,并设置
BasisChanged
属性


请注意,这假定
热动力学属性
为参考类型。如果是值类型,则必须在更改后将其设置回原来的值。

需要显示此类定义。错误很明显,因为您正在检查类型为X的道具,并使用类型为Y的变量进行删除。@nikhilvartak我刚刚看到它应该是热力学属性列表。这是指一类热动力状态。但是潜在的问题是相同的。您需要显示这个类定义。错误很明显,因为您正在检查类型为X的道具,并使用类型为Y的变量进行删除。@nikhilvartak我刚刚看到它应该是热力学属性列表。这是指一类热动力状态。但根本问题是相同的。
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;
     }
}