【问题标题】:Determine if object has field of passed type with specific child value [duplicate]确定对象是否具有具有特定子值的传递类型的字段[重复]
【发布时间】:2019-12-30 06:42:27
【问题描述】:

我想知道是否可以确定一个对象是否具有特定类型的字段(我相信这可以通过使用 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;
    }
}

这样使用:

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,并且始终是传入类型字段上的一个字段,所以如果有办法获得字段,然后[whatever].Value 是我有兴趣检查的内容,无论我传入什么字段类型。
  • 只有 1 个具有所需类型的字段(即 Abc 类中永远不会有 2 个 Foo 字段,即使我只对名为 Foo 的字段感兴趣)
  • 在现实世界中,Abc 对象是使用反序列化生成的。我没有在代码中初始化它。
  • Abc 类是由工具生成的,因此它不能(不应该)被编辑,所以我不能将它作为 Abc 类中的方法。我也有兴趣检查很多不同的值(在现实世界中,Abc 类有几十个我有兴趣检查的字段)所以我假设一个通用方法是最简单的。

【问题讨论】:

  • 既然你喜欢反射,问题的主要部分(如何通过反射获取属性)已经被我认为是 duplicate 回答了,希望你知道如何比较值(还有 == vs. Equals无论如何可能是一本好书)所以你应该能够把它整理出来。我个人会使用 dynamic 并比较值 ((dynamic)abcObejct.Value) == "SomeValue"...

标签: c# reflection field


【解决方案1】:

我建议以下代码:

// 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;
}

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

【讨论】:

  • 旁注:你完全搞砸了答案中关于如何比较价值的唯一有趣的部分......(获取属性的价值已经是well covered
猜你喜欢
  • 2016-07-10
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多