C# 确定对象是否具有具有特定子值的传递类型的字段
我想知道是否有可能确定一个对象是否有具有特定类型的字段(我相信可以使用GetField(name)进行反射),然后确定该字段是否有特定的值 例如,假设我们有以下内容: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
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个字段具有所需类型(即,
类中永远不会有2个Abc
字段,即使有,我也只对名为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”
…旁注:你完全搞错了答案中唯一有趣的部分,即如何比较值。。。(获取财产的价值已经是)旁注:你完全搞错了答案中唯一有趣的部分,即如何比较价值。。。(正在获取属性的值)