이 질문에는 이미 답변이 있습니다.
나는 이런 정적 메서드가 있습니다 :
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 메서드는 무엇입니까?
*=> 뒤에 각 속성의 이름을 문자열로 반환합니다.
메소드의 서명을 변경할 수 있습니다. ...에서
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));
}
서명은 그것을 검사 할 수있는 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;
}
에서또 다른 질문, 이것은 당신이 찾고있는 것일 수 있습니다 :
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}
이것을 사용하려면 다음과 같이 작성하십시오.
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
Expression<Func<Student, object>>
. - Jon