3 回答
TA贡献1820条经验 获得超10个赞
尝试这个:
public void Update(MyObject o)
{
MyObject copyObject = ...
Type type = o.GetType();
while (type != null)
{
UpdateForType(type, o, copyObject);
type = type.BaseType;
}
}
private static void UpdateForType(Type type, MyObject source, MyObject destination)
{
FieldInfo[] myObjectFields = type.GetFields(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fi in myObjectFields)
{
fi.SetValue(destination, fi.GetValue(source));
}
}
TA贡献1863条经验 获得超2个赞
嗯 我以为GetFields可以让您的成员从一路走来,BindingFlags.DeclaredOnly如果您不希望继承成员,则必须明确指定。所以我做了一个快速测试,我是对的。
然后我注意到了一些:
我想 使用反射将所有属性从MyObject 更新为另一个。我遇到的问题是特定对象是从基类继承的,而这些基类的属性值未更新。
以下代码复制了顶级属性值。
public void Update(MyObject o) {
MyObject copyObject = ...
FieldInfo[] myObjectFields = o.GetType().GetFields(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
这将仅获取字段(包括此类型的私有字段),而不会获取properties。因此,如果您具有此层次结构(请原谅!):
class L0
{
public int f0;
private int _p0;
public int p0
{
get { return _p0; }
set { _p0 = value; }
}
}
class L1 : L0
{
public int f1;
private int _p1;
public int p1
{
get { return _p1; }
set { _p1 = value; }
}
}
class L2 : L1
{
public int f2;
private int _p2;
public int p2
{
get { return _p2; }
set { _p2 = value; }
}
}
那么.GetFields在L2与BindingFlags你指定会得到f0,f1,f2,和_p2,而不是p0或p1(这是性能,而不是字段)OR _p0或_p1(这是私人的基类,因此类型的对象L2 不具有这些领域。
如果要复制属性,请尝试执行您正在做的事情,而.GetProperties改为使用。
- 3 回答
- 0 关注
- 663 浏览
添加回答
举报