有没有一种方法可以让类使用反射来访问从其继承的类中的字段?

时间:2019-08-21 12:50:22

标签: c# reflection

我要做的是拥有一个可以继承的类,并能够跟踪对属性的更改。

我有一个称为TrackedEntity的基类。

然后我创建另一个从TrackedEntity继承的类TestEntity。

在我的TestEntity类上,我用一个称为CompareValues的属性标记了我的一个字段。

TrackedEntity

  public class TrackedEntity {
        public void GetCompareValues<T> () {

            var type = typeof (T);
            var properties = type.GetProperties ();

            foreach (var property in properties) {

              var attribute = (CompareValues[]) property.GetCustomAttributes 
                                             (typeof(CompareValues), false);

              var hasAttribute = Attribute.IsDefined (property, typeof 
                                   (CompareValues));

            }
        }
    }

TestEntity

public class TestEntity : TrackedEntity
    {
        public int one { get; set; }
        [CompareValues]
        public int two { get; set; }
        public int three { get; set; }
    }

CompareValues属性:

 [AttributeUsage ( AttributeTargets.Property | 
                      AttributeTargets.Field,
                      Inherited = true)]
    public class CompareValues : Attribute {
        public CompareValues () { }
    }

然后我就可以这样做

var test  = new TestEntity ();
test.GetCompareValues<TestEntity> ();

在我的GetCompareValues方法中,我可以找到TestEntity中的哪些字段使用我的CompareValues属性。

我试图找到一种方法来访问具有CompareValues属性的字段的值,以便我可以跟踪更改并记录有关该字段的信息。

如果还有其他方法可以通过使用另一种方法来完成此操作,请告诉我。

谢谢。

1 个答案:

答案 0 :(得分:2)

您快到了。您需要做的就是获取当前实例(调用了该方法的实例)上的属性值:

if(hasAttribute)
{
    var value = property.GetValue(this, null);
}

除此之外,您在这里不需要泛型。只需使用此:

var type = this.GetType();

如果实例属于您的派生类型,则返回TestEntity