Этот полезный метод может оказаться полезным, поскольку он также решает еще одну проблему, с которой вы, вероятно, столкнетесь: все немного странно, когда вы хотите получить текущий кадр стека из конструктора.
using Collections = MikeNakis.Abstract.Collections;
using Diagnostics = System.Diagnostics;
using Generic = System.Collections.Generic;
using Reflection = System.Reflection;
[...]
///<summary>Collect stack frames</summary>
///<param name="frames_to_skip">Number of frames to skip (usually 1)</param>
///<param name="type">When invoking from within a constructor, specify the type of the containing class so as to
///skip any other constructors.</param>
public static Generic.IList<Diagnostics.StackFrame> CollectStackframes( int frames_to_skip, System.Type type = null )
{
var frames = new Diagnostics.StackTrace( frames_to_skip + 1, fNeedFileInfo:true ).GetFrames();
int i = 0;
if( type != null )
{
for( ; i < frames.Length; i++ )
{
Reflection.MethodBase method = frames[i].GetMethod();
if( !method.IsConstructor )
break;
//Does not work: if( method.DeclaringType == type )
//Does not work: if( Equals( method.DeclaringType, type ) )
//Does not work: if( Equals( method.DeclaringType.TypeHandle, type.TypeHandle ) )
if( Equals( method.DeclaringType.GUID, type.GUID ) )
{
i++;
break;
}
}
}
var list_of_frame = new Generic.List<Diagnostics.StackFrame>( frames.Length - i );
for( ; i < frames.Length; i++ )
list_of_frame.Add( frames[i] );
return Collections.Util.NewListReadonly( list_of_frame );
}
(Примечание: Collections.Util.NewListReadonly()
- мой метод статической утилиты, который создает список только для чтения и возвращает его интерфейс IList<T>
.)
Я не знаю о производительности new Diagnostics.StackTrace()
: я бы предположил, что он такой же медленный, как использование отражения (вероятно, он считается отражением), но, вероятно, немного быстрее, чем выбрасывает исключение.
Я вас разочарую по поводу части параметров: я не нашел способа получить содержимое параметров для методов во время выполнения. Таким образом, все, что вы можете надеяться получить, это типы и имена параметров, но не их значения. Если вы найдете способ, пожалуйста, дайте мне знать.