2009-08-08 2 views
1

Мне нужно некоторое решение для отслеживания класса-владельца метода, в котором объект построен. Я хочу сказать, что я хочу, чтобы конструктор автоматически разрешал объект Type класса «creator». Возможно ли это на C#?Создание объекта, как решить «класс-владелец»?

ответ

1

Предполагая, что встраивание метода, который необходимо проверить его абонента и разрешения не проблема, вы можете вызвать следующий метод в конструкторе:

[System.Runtime.CompilerServices.MethodImpl(
System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] 
public static Type GetCallerType() 
{ 
    StackTrace st = new StackTrace(2); 
    StackFrame sf = st.GetFrame(0); 
    return sf.GetMethod().DeclaringType; 
} 

Так ваш реальный вопрос, ответ да, это возможно, но не рекомендуется.

EDIT:

Метод требует разрешения отражения для доступа к методу GetMethod() и DeclaringType свойства. Для stack trace требуется разрешение безопасности для неуправляемого кода (если я правильно понимаю документацию), что в основном делает этот метод бесполезным для чего-либо меньшего, чем полностью доверенный код.

Как вы видите, я украсил метод атрибутом, который явно запрашивает JIT, чтобы не встроить метод, так как он ходит по крайней мере один фрейм стека вызовов. Проблемы возникают, если вызывающий метод становится встроенным (или каким бы то ни было преобразованием JIT) в свой собственный метод вызова. Я могу дать образец с коротким свойством, поскольку свойства могут быть встраиваемыми в JIT, хотя я не могу гарантировать, что это Corret:

public object PropertyThatGivesObject 
{ 
    get { return new ObjectThatTracksItsCreator(); } 
} 

Хотя это довольно экзотические (свойство не является «собственностью объекта », это завод), у этого есть хотя бы одна проблема:

  1. Является ли тип объявления свойства действительно создателем (предположим, что это косвенность)?
  2. Если свойство getter inlined, должно ли оно быть объявляющим типом свойства, который был создателем? (Релевантно, если метод, вызывающий свойство, объявляется другим типом)
+0

Thx. Итак, если я понял, я могу получить неправильные результаты, если метод caller привязан к некоторому методу другого класса? И, пожалуйста, можете ли вы описать проблему с разрешениями? Любой пример, пожалуйста? – ALOR

+0

Oooh - по крайней мере один голос: D –

1

Вы можете использовать StackFrame, чтобы узнать, из какого объекта был создан объект, но есть ограничения в отношении того, что он может определить, и когда, например, если вы работаете в каком-то пониженном режиме безопасности, быть в состоянии работать.

3

Объект, естественно, не имеет понятия о создателе.

Если вы хотите надежно определить, что создает объект, вам нужно явно выразить его в конструкторе. Анализ стековых фреймов не только имеет проблемы в средах с низким доверием (как упоминал Лассе), но может быть неточным из-за вложения.

Какую проблему решаете вышли? Почему класс важен для вас? Там может быть лучший подход.

+0

Thx для ответа. Я знаю, что такой концепции нет. Это не большая проблема, но я был заинтересован, если это возможно. Вот ситуация: в настоящее время я работаю с каким-то старым, а не моим кодом. Есть модуль протоколирования, где я всегда должен передавать объект типа вызывающего. Это не нужно, но полезно для регистратора. Поэтому я решил разрешить это с помощью некоторого кода. – ALOR

+0

Я лично передал бы соответствующий тип явно, а не используя отражение. Это проще, даже если это более подробно. –

+0

В конце концов, я тоже.Я прочитал еще несколько об использовании трассировки стека и нашел его уреберным со всем этим компилятором-JIT-материалом. – ALOR