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

我想使用反射将所有属性从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属性可以用来帮助但无济于事。


守着一只汪
浏览 664回答 3
3回答

拉莫斯之舞

尝试这个: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));    }}

小唯快跑啊

嗯 我以为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改为使用。
打开App,查看更多内容
随时随地看视频慕课网APP