in src/Epam.GraphQL/Extensions/ExpressionExtensions.cs [289:330]
public static PropertyInfo GetPropertyInfo(
this LambdaExpression propertyLambda)
{
MemberExpression? member;
if (propertyLambda.Body is UnaryExpression unaryExpression && unaryExpression.NodeType == ExpressionType.Convert)
{
member = unaryExpression.Operand as MemberExpression;
if (member == null)
{
throw new ArgumentException($"Expression '{propertyLambda}' does not refer to a property.");
}
}
else
{
member = propertyLambda.Body as MemberExpression;
if (member == null)
{
throw new ArgumentException($"Expression '{propertyLambda}' refers to a method, not a property.");
}
}
var propInfo = member.Member as PropertyInfo;
if (propInfo == null)
{
throw new ArgumentException($"Expression '{propertyLambda}' refers to a field, not a property.");
}
var type = propertyLambda.Parameters[0].Type;
if (type != propInfo.ReflectedType && !propInfo.ReflectedType.IsAssignableFrom(type))
{
throw new ArgumentException(
$"Expression '{propertyLambda}' refers to a property that is not from type {type}.");
}
if (member.Expression is not ParameterExpression)
{
throw new ArgumentException($"Expression '{propertyLambda}' refers to a nested member.");
}
return type.GetProperty(propInfo.Name) ?? propInfo;
}