为了账号安全,请及时绑定邮箱和手机立即绑定

C#使用反射复制基类属性

C#使用反射复制基类属性

C#
守着一只汪 2019-10-11 10:30:02
我想使用反射将所有属性从MyObject更新为另一个。我遇到的问题是特定对象是从基类继承的,而这些基类的属性值未更新。以下代码复制了顶级属性值。public void Update(MyObject o){    MyObject copyObject = ...    FieldInfo[] myObjectFields = o.GetType().GetFields(    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);    foreach (FieldInfo fi in myObjectFields)    {        fi.SetValue(copyObject, fi.GetValue(o));    }}我一直在寻找是否还有其他BindingFlags属性可以用来帮助但无济于事。
查看完整描述

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));

    }

}


查看完整回答
反对 回复 2019-10-11
?
小唯快跑啊

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改为使用。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 663 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信