C# 确定对象是否具有具有特定子值的传递类型的字段

C# 确定对象是否具有具有特定子值的传递类型的字段,c#,reflection,field,C#,Reflection,Field,我想知道是否有可能确定一个对象是否有具有特定类型的字段(我相信可以使用GetField(name)进行反射),然后确定该字段是否有特定的值 例如,假设我们有以下内容: public class Foo { public string Value; } public class Bar { public string Value; } public class Abc { public Foo Foo; public Bar Bar; } public sta

我想知道是否有可能确定一个对象是否有具有特定类型的字段(我相信可以使用GetField(name)进行反射),然后确定该字段是否有特定的值

例如,假设我们有以下内容:

public class Foo
{
    public string Value;
}

public class Bar
{
    public string Value;
}

public class Abc
{
    public Foo Foo;
    public Bar Bar;
}
public static class FieldChecker
{
    public static bool HasDesiredValue(Abc abcObject, Type fieldType, string value)
    {
        FieldInfo info = abcObject.GetType().GetField(fieldType.Name); //See notes below on why this is ok

        if (info != null && info.FieldType == fieldType)
        {
            //Here is my issue. This obviously isn't real code. Can something like this be done?
            if (abcObject.[FieldWithPassedInTypeAndName].Value == value)
            {
                return true;
            }
        }

        return false;
    }
}
我希望能够做到以下几点:

public class Foo
{
    public string Value;
}

public class Bar
{
    public string Value;
}

public class Abc
{
    public Foo Foo;
    public Bar Bar;
}
public static class FieldChecker
{
    public static bool HasDesiredValue(Abc abcObject, Type fieldType, string value)
    {
        FieldInfo info = abcObject.GetType().GetField(fieldType.Name); //See notes below on why this is ok

        if (info != null && info.FieldType == fieldType)
        {
            //Here is my issue. This obviously isn't real code. Can something like this be done?
            if (abcObject.[FieldWithPassedInTypeAndName].Value == value)
            {
                return true;
            }
        }

        return false;
    }
}
这样使用:

Abc abcObject = new Abc()
{
    Foo = new Foo()
    {
        Value = "SomeValue"
    }
};

bool boolOne = FieldChecker.HasDesiredValue(abcObject, typeof(Foo), "SomeValue"); //true
bool boolTwo = FieldChecker.HasDesiredValue(abcObject, typeof(Foo), "SomeOtherValue"); //false
注意事项:

  • 字段名和字段类型总是相同的,这就是为什么我可以使用GetField(fieldType.name)。如果有更好的方法,我欢迎反馈
  • 我感兴趣的检查内容将始终被称为
    Value
    ,并且始终是传入类型字段上的一个字段,因此,如果有方法获取该字段,则
    [无论什么]。无论传入何种字段类型,值都是我感兴趣的检查内容
  • 只有1个字段具有所需类型(即,
    Abc
    类中永远不会有2个
    Foo
    字段,即使有,我也只对名为
    Foo
    的字段感兴趣)
  • 在现实世界中,Abc对象是使用反序列化生成的。我不是用代码初始化它
  • Abc类是由一个工具生成的,所以它不能(不应该)被编辑,所以我不能在Abc类中使用这个方法。此外,我还对检查许多不同的值感兴趣(在现实世界中,Abc类有几十个字段,我对检查这些字段感兴趣),因此我认为通用方法是最简单的方法

    • 我建议使用以下代码:

      // Check if the object has said property
      public static bool HasProperty(this object obj, string property)
      {
          return obj.GetType().GetProperty(property) != null;
      }
      
      // Get property value
      public static object GetPropertyValue(this object obj, string property)
      {
          return obj.GetType().GetProperty(property).GetValue(obj, null);
      }
      
      public static bool HasDesiredValue(Abc abcObject, Type fieldType, string value)
      {
          if (abcObject.HasProperty(fieldType.Name))
          {
              if (abcObject.GetPropertyValue(fieldType.Name).GetPropertyValue("value").ToString().Equals(value))
              {
                  return true;
              }
          }
          return false;
      }
      

      当然,您需要大量的验证,并围绕边缘进行工作,以确保安全,但这就是它的要点。

      我建议使用以下代码:

      // Check if the object has said property
      public static bool HasProperty(this object obj, string property)
      {
          return obj.GetType().GetProperty(property) != null;
      }
      
      // Get property value
      public static object GetPropertyValue(this object obj, string property)
      {
          return obj.GetType().GetProperty(property).GetValue(obj, null);
      }
      
      public static bool HasDesiredValue(Abc abcObject, Type fieldType, string value)
      {
          if (abcObject.HasProperty(fieldType.Name))
          {
              if (abcObject.GetPropertyValue(fieldType.Name).GetPropertyValue("value").ToString().Equals(value))
              {
                  return true;
              }
          }
          return false;
      }
      

      当然,你需要大量的验证并围绕边缘进行工作,以确保安全,但这就是要点。

      因为你喜欢反射,所以我相信问题的主要部分(如何通过反射获取属性)已经得到了回答,希望你知道如何比较值(无论如何也可能是一本不错的读物)所以你应该能把它整理出来。我个人会使用
      dynamic
      ,只是比较值
      ((dynamic)abcObejct.value)=“SomeValue”
      …因为你喜欢反射,所以问题的主要部分(如何通过反射获取属性)已经由我相信的答案回答了,希望你知道如何比较值(无论如何也可能是一本好读物)所以你应该能把它整理出来。我个人会使用
      dynamic
      ,只是比较值
      ((dynamic)abcObejct.value)=“SomeValue”
      …旁注:你完全搞错了答案中唯一有趣的部分,即如何比较值。。。(获取财产的价值已经是)旁注:你完全搞错了答案中唯一有趣的部分,即如何比较价值。。。(正在获取属性的值)