func에서 실행 된 호출 된 메소드의 이름 검색
-
22-07-2019 - |
문제
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 : 나를 표시 한 사람은 여기서 무슨 일이 일어나고 있는지 깨닫는 데 잠시 시간이 걸립니다. 발현 나무는 람다 표현식과 함께 암시 적으로 사용될 수 있으며 여기에서 특정 요청 정보를 얻는 가장 빠르고 신뢰할 수있는 방법입니다.
제휴하지 않습니다 StackOverflow