При помощи StackTrace/StackFrame я могу узнать очень много всего интересного — вызывающий метод, класс которому принадлежит этот метод етс. Но! Совершенно невозможно получить ссылку на экземпляр класса, вызвавший этот метод!
Зачем это мне нужно: типа пишу некую систему, в которой будут взаимодействовать объекты, и хочу наложить определенное policy на то, как они друг у друга будут методы вызывать. Конкретно — что все методы, которые изменяют состояние объекта могут вызываться только "текущим" объектом (исключив таким образом возможность reentrancy (которая начинает играть новыми страшными красками в ООП)).
На вид оптимально было бы в начале каждого такого "проверяемого" метода ставить что-нить типа ObjectManager.CheckCall(), который бы проверил, что объект вызвавший этод метод (не CheckCall, а тот, в начале которого стоит CheckCall) имел право это сделать (т.е. являлся текущим). В дебаге. А в релизе был бы пустым.
А то подходить к этому с другой стороны и парсить мсил-код каким-нить образом ужасно не хочется.
В поиске сумел найти совет что типа наследоваться от ContextBoundObject (причем не прямо, а от каким-нить базовым классом, причем в другой ассембли, чтобы можно было ее подменять легко), и что типа мне от етого будет щастье. А проще нельзя?
упс. до конца вопрос не дочитал
Это я был тем анонимом.
Так вот. Я даже нашел забавного чувака, который написАл фиговинку, которая вызывается перед вызовом метода.
http://www.thecodeproject.com/csharp/AspectIntercept.asp. Но! Эта его фиговинка тоже получает IMethodCallMessage, в котором никакого сендера или каллера нет совершенно! У меня создается странное ощущение, что, если зарыться в этот загадочный RPC совсем глубоко, то, может быть, можно будет что-нить найти, но подходить следует с совершенно другого конца.
Вот интересно. В микрософт вижуал студио в дебаге же показываются локальные переменные объекта... На любом уровне калл-стека. Где вообще this лежит?