문제

func로 위임 된 메소드의 이름을 얻고 싶습니다.

Func<MyObject, object> func = x => x.DoSomeMethod();
string name = ExtractMethodName(func); // should equal "DoSomeMethod"

이것을 어떻게 달성 할 수 있습니까?

-자랑 권리를 위해-

만들다 ExtractMethodName 또한 속성 호출과 협력하여 해당 인스턴스의 속성 이름을 반환하십시오.

예를 들어.

Func<MyObject, object> func = x => x.Property;
string name = ExtractMethodName(func); // should equal "Property"
도움이 되었습니까?

해결책

ma 봐! 표현 나무가 없습니다!

다음은 기본 Lambda의 IL 스트림에서 메타 데이터 토큰을 잡고 해결하는 빠르고 더럽고 구현 특정 버전입니다.

private static string ExtractMethodName(Func<MyObject, object> func)
{
    var il = func.Method.GetMethodBody().GetILAsByteArray();

    // first byte is ldarg.0
    // second byte is callvirt
    // next four bytes are the MethodDef token
    var mdToken = (il[5] << 24) | (il[4] << 16) | (il[3] << 8) | il[2];
    var innerMethod = func.Method.Module.ResolveMethod(mdToken);

    // Check to see if this is a property getter and grab property if it is...
    if (innerMethod.IsSpecialName && innerMethod.Name.StartsWith("get_"))
    {
        var prop = (from p in innerMethod.DeclaringType.GetProperties()
                    where p.GetGetMethod() == innerMethod
                    select p).FirstOrDefault();
        if (prop != null)
            return prop.Name;
    }

    return innerMethod.Name;
}

다른 팁

나는 이것이 일반적인 경우에 가능하다고 생각하지 않습니다. 당신이 가지고 있다면?

Func<MyObject, object> func = x => x.DoSomeMethod(x.DoSomeOtherMethod());

무엇을 기대 하시겠습니까?

즉, 반사를 사용하여 Func Object를 열고 내부에서 수행하는 작업을 볼 수 있지만 특정 경우에만 해결할 수 있습니다.

여기에서 내 해킹 답변을 확인하십시오.

C#에`fieldof` 또는`methodof` 연산자가없는 이유는 무엇입니까?

과거에 나는 사용한 또 다른 방식으로 Func 대신에 Expression<Func<...>>, 그러나 나는 그 결과에 훨씬 덜 만족했다. 그만큼 MemberExpression 내 필드를 감지하는 데 사용됩니다 fieldof 메소드는 a를 반환합니다 PropertyInfo 속성을 사용하는 경우.

편집 #1 : 문제의 하위 집합에 적합합니다.

Func<object> func = x.DoSomething;
string name = func.Method.Name;

편집 #2 : 나를 표시 한 사람은 여기서 무슨 일이 일어나고 있는지 깨닫는 데 잠시 시간이 걸립니다. 발현 나무는 람다 표현식과 함께 암시 적으로 사용될 수 있으며 여기에서 특정 요청 정보를 얻는 가장 빠르고 신뢰할 수있는 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top