What are the uses for this static reflection code?

This is Oliver Hanappi's static reflection code, which he posted on stackoverflow

private static string GetMemberName(Expression expression)
    {
        switch (expression.NodeType)
        {
            case ExpressionType.MemberAccess:
                var memberExpression = (MemberExpression)expression;
                var supername = GetMemberName(memberExpression.Expression);

                if (String.IsNullOrEmpty(supername))
                    return memberExpression.Member.Name;

                return String.Concat(supername, '.', memberExpression.Member.Name);

            case ExpressionType.Call:
                var callExpression = (MethodCallExpression)expression;
                return callExpression.Method.Name;

            case ExpressionType.Convert:
                var unaryExpression = (UnaryExpression)expression;
                return GetMemberName(unaryExpression.Operand);

            case ExpressionType.Parameter:
                return String.Empty;

            default:
                throw new ArgumentException("The expression is not a member access or method call expression");
        }
    }

I have public wrapper methods:

public static string Name<T>(Expression<Action<T>> expression)
    {
        return GetMemberName(expression.Body);
    }
public static string Name<T>(Expression<Func<T, object>> expression)
    {
        return GetMemberName(expression.Body);
    }

then added my own keyboard shortcuts

        public static string ClassMemberName<T>(this T sourceType,Expression<Func<T,object>> expression)
    {
        return GetMemberName(expression.Body);
    }
    public static string TMemberName<T>(this IEnumerable<T> sourceList, Expression<Func<T,object>> expression)
    {
        return GetMemberName(expression.Body);
    }

What are some code examples that will require or take advantage of the different branches in the switch GetMemberName(Expression expression)? What is all this code capable of doing strongly typed?

+3
source share
2 answers
  • MemberAccess: foo => foo.SomeFieldorfoo => foo.SomeProperty
  • Call: foo => foo.SomeMethod(...)
  • Parameter: foo => foo
  • Convert: foo => (int)foo.Something(possibly implicit)
+2
source

, ( , , " " ), , .

INotifyPropertyChanged.

, :

string _name
public string name
{
    get { return _name; }
    set
    {
        if(value.Equals(_name)) return;
        _name = value;
        OnPropertyChanged("name");
    }
}

"", . , : " ... ". PersonName, , "name" "PersonName"? , . , , 20 .

:

string _name
public string name
{
    get { return _name; }
    set
    {
        if(value.Equals(_name)) return;
        _name = value;
        OnPropertyChanged(x => x.name);
    }
}

... OnPropertyChanged , , .

, PersonName, , x => x.PersonName. .

, -, , ; MemberExpression - , ..

, INotifyPropertyChanged, , , - ; , - .

+3

Source: https://habr.com/ru/post/1740225/


All Articles