C# 对象创建,如何解决;类所有者“;?

C# 对象创建,如何解决;类所有者“;?,c#,C#,我需要一些解决方案来跟踪在其中构造对象的方法的类所有者。我的意思是,我希望构造函数自动解析“creator”类的Type对象。在C#?中是否可能使用查找对象的构造来源,但它所能查找的内容和时间存在限制,例如,如果在某种较低的安全模式下运行,它将无法工作。您可以使用查找对象的构造来源,但是,它所能理解的还有一些限制,例如,如果您在某种较低的安全模式下运行,它将无法工作。对象自然没有任何创建者的概念 如果您想可靠地确定是什么在创建一个对象,您需要在构造函数中显式地表达它。分析堆栈帧不仅在低信任环境(

我需要一些解决方案来跟踪在其中构造对象的方法的类所有者。我的意思是,我希望构造函数自动解析“creator”类的Type对象。在C#?

中是否可能使用查找对象的构造来源,但它所能查找的内容和时间存在限制,例如,如果在某种较低的安全模式下运行,它将无法工作。

您可以使用查找对象的构造来源,但是,它所能理解的还有一些限制,例如,如果您在某种较低的安全模式下运行,它将无法工作。

对象自然没有任何创建者的概念

如果您想可靠地确定是什么在创建一个对象,您需要在构造函数中显式地表达它。分析堆栈帧不仅在低信任环境(如Lasse所述)中存在问题,而且由于内联,可能不准确


你想解决什么更大的问题?为什么这门课对你很重要?可能有更好的方法。

一个对象自然没有任何创造者的概念

如果您想可靠地确定是什么在创建一个对象,您需要在构造函数中显式地表达它。分析堆栈帧不仅在低信任环境(如Lasse所述)中存在问题,而且由于内联,可能不准确


你想解决什么更大的问题?为什么这门课对你很重要?可能有更好的方法。

假设需要检查其调用方和权限的方法的内联没有问题,您可以在构造函数中调用以下方法:

[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
属性。对于,需要为非托管代码提供安全权限(如果我正确理解文档的话),这基本上使此方法对于不完全受信任的代码无效

如您所见,我用一个属性修饰了该方法,该属性显式地请求JIT不要内联该方法,因为它至少在调用堆栈上遍历一个帧。如果调用方法在其自己的调用方法中内联(或JIT应用的任何转换),就会出现问题。我可以给出一个带有短属性的示例,因为属性很可能由JIT内联,尽管我不能保证这是正确的:

public object PropertyThatGivesObject
{
    get { return new ObjectThatTracksItsCreator(); }
}
虽然这很奇怪(属性不是“对象属性”,而是工厂),但至少有一个问题:

  • 属性的声明类型真的是创建者吗(假设它是间接寻址)
  • 如果属性getter是内联的,那么它是否应该是属性的声明类型,即创建者?(如果调用属性的方法由其他类型声明,则相关)

  • 假设需要检查调用方和权限的方法的内联没有问题,您可以在构造函数中调用以下方法:

    [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
    属性。对于,需要为非托管代码提供安全权限(如果我正确理解文档的话),这基本上使此方法对于不完全受信任的代码无效

    如您所见,我用一个属性修饰了该方法,该属性显式地请求JIT不要内联该方法,因为它至少在调用堆栈上遍历一个帧。如果调用方法在其自己的调用方法中内联(或JIT应用的任何转换),就会出现问题。我可以给出一个带有短属性的示例,因为属性很可能由JIT内联,尽管我不能保证这是正确的:

    public object PropertyThatGivesObject
    {
        get { return new ObjectThatTracksItsCreator(); }
    }
    
    虽然这很奇怪(属性不是“对象属性”,而是工厂),但至少有一个问题:

  • 属性的声明类型真的是创建者吗(假设它是间接寻址)
  • 如果属性getter是内联的,那么它是否应该是属性的声明类型,即创建者?(如果调用属性的方法由其他类型声明,则相关)

  • 谢谢你的回答。我知道没有这样的概念。这不是什么大问题,但如果可能的话,我很感兴趣。情况是这样的——我目前使用的是一些旧代码,而不是我的代码。有一个日志模块,我应该总是在其中传递调用者的类型对象。它不是真正需要的,但对记录器很有用。所以我想通过一些代码来解决它。我个人会显式地传递适当的类型,而不是使用反射。它更简单,即使它更冗长。最终,我也是。我读了一些关于堆栈跟踪用法的更多信息,并发现它与所有这些编译器有关,答案是-JIT-stuff.Thx。我知道没有这样的概念。这不是什么大问题,但如果可能的话,我很感兴趣。情况是这样的——我目前使用的是一些旧代码,而不是我的代码。有一个日志模块,我应该总是在其中传递调用者的类型对象。它不是真正需要的,但对记录器很有用。所以我想通过一些代码来解决它。我个人会显式地传递适当的类型,而不是使用反射。它更简单,即使它更冗长。最终,我也是。我读了一些关于堆栈跟踪用法的更多信息,发现它与所有这些编译器-JIT-stuff.Thx都是兼容的。所以,若我理解了,若调用方方法内联到其他类的某个方法,我可能会得到错误的结果?另外,请你能更详细地描述一下权限问题吗?请举个例子好吗?谢谢。所以,如果我理解的话,