6

나는 이런 정적 메서드가 있습니다 :

    public static string MyMethod(Func<Student, object> func)
    {            
        return ??? ;
    }

나는 다음과 같이 사용한다.

    var s1 = MyMethod(student => student.ID); // Return "ID" ???
    var s2 = MyMethod(student => student.Age); // Return "Age" ???
    var s3 = MyMethod(student => student.Name); // Return "Name" ???

다음과 같은 결과를 반환하는 write 메서드는 무엇입니까?

  • s1 : "ID"
  • s2 : "나이"
  • s3 : "이름"

*=> 뒤에 각 속성의 이름을 문자열로 반환합니다.


  • 이 서명으로는 할 수 없습니다.Expression<Func<Student, object>>. - Jon

3 답변


1

메소드의 서명을 변경할 수 있습니다. ...에서

  public static string MyMethod(Func<Student, object> func)

그것을

  public static string MyMethod(Expression<Func<Student, object>> func) {
     return GetMemeberName(func)
  } 

  public static string GetMemberName(Expression expression)
    {            
        if (expression is LambdaExpression)
        {
            var lambdaExpression = (LambdaExpression)expression;
            return GetMemberName(lambdaExpression.Body);                              
        }

        if (expression is MemberExpression)
        {
            var memberExpression = (MemberExpression)expression;
            if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess)
            {
                return GetMemberName(memberExpression.Expression)+ "."+ memberExpression.Member.Name;
            }
            return memberExpression.Member.Name;
        }

        if (expression is UnaryExpression)
        {
            var unaryExpression = (UnaryExpression)expression;
           if (unaryExpression.NodeType != ExpressionType.Convert)
                throw new Exception(string.Format(
                    "Cannot interpret member from {0}",
                    expression));
            return GetMemberName(unaryExpression.Operand);
        }
        throw new Exception(string.Format("Could not determine member from {0}",expression));
    }  


  • 이것은 좋은 일이지만, 당신은 그에게 일하게하는 방법을 말해야합니다. OP가 가지고있다.Func<>, 아니라Expression. - Gabe
  • 기본적으로이 코드는 유용하지만 명시된 질문에 대한 답변에 가깝지 않습니다. 나는 그것이 진짜 대답으로 만들어지면 이것을 upvote 것입니다. - Jon
  • 또한 유형이 매개 변수 인 경우Expression람다를 사용하여 전화 할 수 없습니다. - Servy
  • @ 가브리가 설명을 추가했습니다. - vittore
  • @ 존은 세부 사항을 추가했습니다. - vittore

0

서명은 그것을 검사 할 수있는 func보다는 표현 트리를 포함해야합니다. 다행히 컴파일러가 람다에서 표현을 생성하기 때문에 호출이 변경되지 않습니다.

이 버전은 아마도 가장 짧을 것입니다. 재귀를 포함하지 않지만 단순한 속성 액세스 람다 (lambdas)에서만 작동합니다.

public static string MyFunc( Expression<Func<Student, object>> Property )
{
     if ( Property != null && Property.Body != null )
         if ( Property.Body.NodeType == ExpressionType.MemberAccess )
         {
             MemberExpression memberExpression = 
                (MemberExpression)Property.Body;

             if ( !string.IsNullOrEmpty( memberExpression.Member.Name ) )
                 return memberExpression.Member.Name;

         }

     return string.Empty;
 }


0

에서또 다른 질문, 이것은 당신이 찾고있는 것일 수 있습니다 :

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
    return (propertyExpression.Body as MemberExpression).Member.Name;
}

이것을 사용하려면 다음과 같이 작성하십시오.

var propertyName = GetPropertyName(
    () => myObject.AProperty); // returns "AProperty"

연결된 질문


관련된 질문

최근 질문