Skip to content

Commit 3df13e4

Browse files
authored
Merge pull request #90 from EFNext/fix/nonpublic-interface-accessors
include non-public accessors when resolving implementing properties
2 parents 5c44212 + d6d5dad commit 3df13e4

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

‎src/ExpressiveSharp/Extensions/TypeExtensions.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ private static MethodInfo GetImplementingMethod(this Type derivedType, MethodInf
122122

123123
public static PropertyInfo GetImplementingProperty(this Type derivedType, PropertyInfo propertyInfo)
124124
{
125-
var accessor = propertyInfo.GetAccessors()[0];
125+
var accessor = propertyInfo.GetAccessors(true)[0];
126126

127127
var implementingAccessor = derivedType.GetImplementingMethod(accessor);
128128
if (implementingAccessor == accessor)

‎tests/ExpressiveSharp.Tests/Extensions/TypeExtensionsTests.cs‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,27 @@ public void GetConcreteProperty_SameDeclaringType_ReturnsOriginal()
110110

111111
Assert.AreEqual(animalName, result);
112112
}
113+
114+
public interface IHidden
115+
{
116+
internal string Secret { get; }
117+
}
118+
119+
public class HiddenImpl : IHidden
120+
{
121+
string IHidden.Secret => "s";
122+
}
123+
124+
[TestMethod]
125+
public void GetConcreteProperty_InterfacePropertyWithNonPublicAccessor_DoesNotThrow()
126+
{
127+
var interfaceProperty = typeof(IHidden)
128+
.GetProperty(nameof(IHidden.Secret), BindingFlags.NonPublic | BindingFlags.Instance);
129+
Assert.IsNotNull(interfaceProperty);
130+
131+
var result = typeof(HiddenImpl).GetConcreteProperty(interfaceProperty);
132+
133+
Assert.IsNotNull(result);
134+
Assert.AreEqual(typeof(HiddenImpl), result.DeclaringType);
135+
}
113136
}

0 commit comments

Comments
 (0)