简体   繁体   中英

c#: How to get the value of 'this' with Reflection?

Is there a way to find out the value of the implicit this parameter which is passed into a function a few stack frames above the current code? I know this sounds weird, so let me give you the bigger picture.

I am working with a framework for test automation that lets me plug in my own code in a separate .NET assembly. My code is a public static method which eventually gets called by the framework. From the way the framework works I know that my code is indirectly called by a Run method. Run is a non-static method of a class that implements the ITestModule interface.

My code wants to access a non-static property in the instance whose Run method is executing, or in other words, a property member of the implicit this of the Run method.

The code I wrote so far uses the StackTrace class to traverse the stack and asks each stack frame whether its method has the signature which I expect. Once it find a match, the code asks the method's ReflectedType for the underlying class from which it gets a PropertyInfo for the requested property. If now I had this as well, I could go ahead and call MethodInfo.GetMethod.Invoke to retrieve the property value.

This is the code, omitting error checking etc.

StackTrace st = new StackTrace();
for (int j = 0; j < st.FrameCount; ++j)
{
  // examine each stack frame until we find what we are looking for
  StackFrame frame = st.GetFrame(j);
  MethodBase method = frame.GetMethod(); // executing method
  if (method.ToString() == "<method signature>")
  {
    // We have found the "Run" method
    Type rType = method.ReflectedType; // class of which "Run" is a member
    PropertyInfo pInfo = rType.GetProperty(property_name); // the property
    MethodInfo propGet = pInfo.GetMethod; // the property's "get" accessor

    Object instance = ...; // The "this" of the "Run" method
    Object result = propGet.Invoke(instance, null); // Retrieve the property value
    // do something with result

    break;
  }
}

It is the Object instance = ...; line that gives me headache.

Thanks a lot for any suggestions.

Hans

Obviously, the answer is "no way to do this". And besides, I found a much better way, using a function in that framework. (I'm only posting this answer so that I can mark the question as answered.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM