public static MemberExpression Property(Expression expression, PropertyInfo property)
{
ContractUtils.RequiresNotNull(property, nameof(property));
MethodInfo mi = property.GetGetMethod(nonPublic: true);
if (mi == null)
{
mi = property.GetSetMethod(nonPublic: true);
if (mi == null)
{
throw Error.PropertyDoesNotHaveAccessor(property, nameof(property));
}
else if (mi.GetParametersCached().Length != 1)
{
throw Error.IncorrectNumberOfMethodCallArguments(mi, nameof(property));
}
}
else if (mi.GetParametersCached().Length != 0)
{
throw Error.IncorrectNumberOfMethodCallArguments(mi, nameof(property));
}
if (mi.IsStatic)
{
if (expression != null) throw Error.OnlyStaticPropertiesHaveNullInstance(nameof(expression));
}
else
{
if (expression == null) throw Error.OnlyStaticPropertiesHaveNullInstance(nameof(property));
RequiresCanRead(expression, nameof(expression));
if (!TypeUtils.IsValidInstanceType(property, expression.Type))
{
throw Error.PropertyNotDefinedForType(property, expression.Type, nameof(property));
}
}
return MemberExpression.Make(expression, property);
}