This repository has been archived on 2023-02-02. You can view files and clone it, but cannot push or open issues or pull requests.
mfgames-nitride-cil/src/MfGames.Nitride/ExpressionHelper.cs
D. Moonfire 9e93eb6ce6 refactor!: fixed missed namespaces
- reformatted code and cleaned up references
2023-01-14 18:19:42 -06:00

68 lines
1.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace MfGames.Nitride;
/// <summary>
/// Helper methods for getting the names of properties.
/// </summary>
public static class ExpressionHelper
{
public static string GetMemberName<T>(
Expression<Func<T, object?>> expression)
{
return GetMemberName(expression.Body);
}
public static IEnumerable<string> GetMemberNames<T>(
params Expression<Func<T, object?>>[] expressions)
{
return expressions.Select(x => GetMemberName(x.Body));
}
public static IEnumerable<string> GetMemberNames<T>(
this T instance,
params Expression<Func<T, object?>>[] expressions)
{
return GetMemberNames<T>(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;
}
}