我需要一些解决方案来跟踪方法的类所有者,在该方法中构造对象。我的意思是说,我希望构造函数自动解析“creator”类的Type对象。是否有可能在C#?
答案 0 :(得分:3)
对象自然不具有创建者的任何概念。
如果要可靠地确定创建对象的内容,则需要在构造函数中明确表达它。分析堆栈帧不仅在低信任环境中存在问题(如Lasse所述),但由于内联而可能不准确。
你想解决什么更大的问题?为什么班级对你很重要?可能有更好的方法。
答案 1 :(得分:1)
您可以使用StackFrame找出构造对象的位置,但是它可以找出什么以及何时有限制,例如,如果您在某种降低的安全模式下运行,它将无法工作。
答案 2 :(得分: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;
}
所以对于你真正的问题,答案是肯定的,这是可能的,但不推荐。
编辑:
该方法需要反射权限才能访问GetMethod()
方法和DeclaringType
属性。对于stack trace,需要非托管代码的安全权限(如果我正确理解文档),这基本上使得此方法对于完全受信任的代码之外的任何内容都无用。
如您所见,我使用一个显式请求JIT不要内联方法的属性来装饰方法,因为它将至少一个帧移到调用堆栈中。如果调用方法在其自己的调用方法中内联(或JIT适用的任何转换),则会出现问题。我可以给一个带有短属性的样本,因为JIT可能会对属性进行内联,但我无法保证这是正确的:
public object PropertyThatGivesObject
{
get { return new ObjectThatTracksItsCreator(); }
}
虽然这很奇特(该属性不是“对象的属性”,但它是一个工厂),这至少有一个问题: