C#反射:获取特定实例的引用列表?

C#反射:获取特定实例的引用列表?,c#,reflection,reference-counting,C#,Reflection,Reference Counting,假设我有一个简单的类结构,如上所述,有没有一种方法可以获得所有对象的列表,这些对象包含对调用了Method()的BBB实例的引用 public class AAA { public BBB fieldInstance; } public class BBB { public void Method() { //I would like to obtain a reference to the object(s) that //are pointi

假设我有一个简单的类结构,如上所述,有没有一种方法可以获得所有对象的列表,这些对象包含对调用了
Method()
BBB
实例的引用

public class AAA {
    public BBB fieldInstance;
}

public class BBB {
    public void Method() {
        //I would like to obtain a reference to the object(s) that
        //are pointing at this instance of BBB.
    }
}

显然,这是一个有趣的例子,因为
Method()
可以很容易地将
aaa
的引用作为参数。我仍然有兴趣知道这是否可行。我假设垃圾收集器拥有所有这些信息,但我不知道如何访问它。

如果没有start元素,这是完全不可能的

下面的危险读数;效率极低,但能胜任工作

另一方面,如果您有一个开始元素,则可以使用反射遍历引用类型的所有属性和字段,并查看它们是否引用该元素,即:

//Example
AAA aaa = new AAA();
aaa.fieldInstance = new BBB();
aaa.fieldInstance.Method();
//Method should obtain a reference to aaa.
然后递归地对值和引用类型的属性和字段执行相同的操作


我现在手头没有更多的时间,但如果需要的话,我可以回话提供一些片段。

我认为这在内置的.NET机制中是不可能的。看

当然,您可以进行一些手动跟踪(但跟踪是您的责任)。简单的例子:

Object.ReferenceEquals(this, obj2);
公共静态类监视,其中T:class{
静态IList s_References=新列表();
公共静态T观察(对象引用,T实例){
如果(!s_References.Contains(referer)){
s_参考。添加(参考者);
}
返回实例;
}
公共静态IList引用{
获取{返回新的只读集合(s_引用);}
}
}
AAA=新的AAA();
aaa.fieldInstance=Watch.Observe(aaa,新BBB());
AAA ccc=新的AAA();
ccc.fieldInstance=Watch.Observe(ccc,new BBB());
var foo=Watch.References;

这是完全不可能的。GC不跟踪引用。它每次都构建可访问性树。根是静态字段,当前执行的方法是局部变量。所有可以从根部接触到的东西都能保存下来。其他的一切都不会被检查。可能的重复不完全是重复,不。尽管有一个答案确实回答了另一个。这是关于对实例的引用。另一个是关于对类型的引用。
public static class Watch<T> where T : class {
  static IList<object> s_References = new List<object>();

  public static T Observe<T>(object referrer, T instance) {
    if (!s_References.Contains(referrer)) {
      s_References.Add(referrer);
    }
    return instance;
  }

  public static IList<object> References {
    get { return new ReadOnlyCollection<object>(s_References); }
  }
}

AAA aaa = new AAA();
aaa.fieldInstance = Watch<BBB>.Observe(aaa, new BBB());

AAA ccc = new AAA();
ccc.fieldInstance = Watch<BBB>.Observe(ccc, new BBB());

var foo = Watch<BBB>.References;