使用c#反射获取并设置通用对象内通用字段的值。但是我找不到任何方法来获取这些字段的属性值。下面的代码示例:
public class Foo<T>
{
public bool IsUpdated { get; set; }
}
public abstract class ValueObjec<T>
{
public string InnerValue { get; set; }
}
public class ItemList: ValueObject<ItemList>
{
public Foo<string> FirstName;
public Foo<string> LastName;
}
问题
在行(*)处获取'null'项目。
itemField.GetType()始终返回System.Reflection.RtFieldInfo类型,但不返回Foo类型。
我已经尝试使用itemField.FieldType.GetProperty(“ IsUpdated”),当返回正确的属性时它可以工作。但是抛出错误“对象与目标类型不匹配”。每当调用GetValue()方法时
itemField.FieldType.GetProperty(“ IsUpdated”)。GetValue(itemField,null)
如果得到任何人的帮助,将不胜感激!
var itemList = new ItemList();
foreach (var itemField in itemList.GetType().GetFields())
{
var isUpdated = "false";
var isUpdatedProp = itemField.GetType().GetProperty("IsUpdated"); // (*) return null from here
if (isUpdatedProp != null)
{
isUpdated = isUpdatedProp.GetValue(itemField, null).ToString();
if (isUpdated == "false") isUpdatedProp.SetValue(itemField, "true");
}
}
foreach (var itemField in itemList.GetType().GetFields())
{
var isUpdated = "false";
var isUpdatedProp = itemField.FieldType.GetProperty("IsUpdated");
if (isUpdatedProp != null)
{
isUpdated = isUpdatedProp.GetValue(itemField, null).ToString(); (*) // throw error "Object does not match target type"
if (isUpdated == "false") isUpdatedProp.SetValue(itemField, "true");
}
}
最佳答案
让我们一次解开这件事:
var isUpdatedProp = itemField.GetType().GetProperty("IsUpdated");
您永远不需要在成员上使用
.GetType()
;您需要.FieldType
或.PropertyType
(对于属性)。 nameof
很棒:var isUpdatedProp = itemField.FieldType.GetProperty(nameof(Foo<string>.IsUpdated));
(
string
这是一个假人)然后:
isUpdated = isUpdatedProp.GetValue(itemField, null).ToString();
不是
itemField
是您的对象-那个对象上itemField
的值将为您提供什么。所以传进去;并将结果视为布尔值(如果可能):var isUpdated = false;
object foo = itemField.GetValue(itemList);
...
isUpdated = (bool)isUpdatedProp.GetValue(foo, null);
最后:
if (isUpdated == "false") isUpdatedProp.SetValue(itemField, "true");
同样,对象是
itemList
,而属性不是string
if (!isUpdated) isUpdatedProp.SetValue(foo, true);
如果创建
Foo<T> : IFoo
其中IFoo
是非通用接口,则会更容易:interface IFoo { bool IsUpdated {get; set; } }
然后变成:
var foo = (IFoo)itemField.GetValue(itemList);
if(!foo.IsUpdated) foo.IsUpdated = true;
最后,请注意,如果您尚未为其分配任何内容,则
FirstName
和LastName
将为null。