When trying to get properties accessors from derived properties or use CanRead / CanWrite, for some reason base auto-properties are not taken into account.
CanRead
and CanWrite
return values based only on the derived type, also GetMethod
and SetMethod
don't contain methods from base type.
However when writing code accessors from base type can be used (so that we can read overridden auto-property with only setter defined in derived type).
Here is the code to reproduce it written as an unit test:
using System.Reflection;
using NUnit.Framework;
[TestFixture]
public class PropertiesReflectionTests
{
public class WithAutoProperty
{
public virtual object Property { get; set; }
}
public class OverridesOnlySetter : WithAutoProperty
{
public override object Property
{
set => base.Property = value;
}
}
private static readonly PropertyInfo Property = typeof(OverridesOnlySetter).GetProperty(nameof(OverridesOnlySetter.Property));
// This one is passing
[Test]
public void Property_ShouldBeReadable()
{
var overridesOnlySetter = new OverridesOnlySetter {Property = "test"};
Assert.AreEqual(overridesOnlySetter.Property, "test");
}
// This one is failing
[Test]
public void CanRead_ShouldBeTrue()
{
Assert.True(Property.CanRead);
}
// And this is failing too
[Test]
public void GetMethod_ShouldBeNotNull()
{
Assert.NotNull(Property.GetMethod);
}
}
I expected last two tests to pass, what am I missing?