【发布时间】: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