using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace MfGames.Nitride;
///
/// Helper methods for getting the names of properties.
///
public static class ExpressionHelper
{
public static string GetMemberName(
Expression> expression)
{
return GetMemberName(expression.Body);
}
public static IEnumerable GetMemberNames(
params Expression>[] expressions)
{
return expressions.Select(x => GetMemberName(x.Body));
}
public static IEnumerable GetMemberNames(
this T instance,
params Expression>[] expressions)
{
return GetMemberNames(expressions);
}
private static string GetMemberName(Expression expression)
{
if (expression == null)
{
throw new ArgumentException(nameof(expression));
}
if (expression is MemberExpression memberExpression)
{
return memberExpression.Member.Name;
}
if (expression is MethodCallExpression methodCallExpression)
{
return methodCallExpression.Method.Name;
}
if (expression is UnaryExpression unaryExpression)
{
return GetMemberName(unaryExpression);
}
throw new ArgumentException(nameof(expression));
}
private static string GetMemberName(UnaryExpression unaryExpression)
{
if (unaryExpression.Operand is MethodCallExpression
methodCallExpression)
{
return methodCallExpression.Method.Name;
}
return ((MemberExpression)unaryExpression.Operand).Member.Name;
}
}