C# CollectionChanged获取保存集合的对象的实例

C# CollectionChanged获取保存集合的对象的实例,c#,reflection,instance,observablecollection,C#,Reflection,Instance,Observablecollection,是否可以在CollectionChanged事件中获取项目的实例 例如: public class Foo { public string Name { get; set; } public ObservableCollection<Bar> Bars { get; set; } public Foo() { Bars += HelperFoo.Bars_CollectionChanged; } } public class

是否可以在CollectionChanged事件中获取项目的
实例

例如:

public class Foo
{
    public string Name { get; set; }
    public ObservableCollection<Bar> Bars { get; set; }

    public Foo()
    {
        Bars += HelperFoo.Bars_CollectionChanged;
    }
}

public class Bar
{
    public string Name { get; set; }
}

public static class HelperFoo
{
    public static voic Bars_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        //sender is the collection Foo.Bars
        //can I get the Instance of Foo?
    }
}
public class Foo
{
    public string Name { get; set; }

    public Foo()
    {
        var bar = new Bar(); //yes I know, I could write new Bar(this) and provide an overload for this
    }
}

public class Bar
{
    public string Name { get; set; }

    public Bar()
    {
        //Get the Foo, since the constructor is called within Foo, is this possible?
        //without providing an overload that takes an object, and just change it to `(new Bar(this))`
    }
}

您的代码结构似乎很奇怪

如果您的
HelperFoo
类需要对
Foo
执行某些操作,则将其传递给
Foo
,并让其订阅
Bar
事件本身

如果
HelperFoo
不应该知道任何关于
bar
的信息,那么就在
Foo
上公开一个事件并订阅它。当
bar
更改时,您可以在
Foo
内引发事件


请仔细阅读。

我同意@Gaz的观点,但是如果你真的想做你所描述的事情,那么就给你的HelperFoo类添加一本字典。然后在你的Foo类中添加这个作为创建者,如下所示

public static class HelperFoo
{
    private static Dictionary<ObservableCollection<Bar>, object> lookupCreators = new Dictionary<ObservableCollection<Bar>, object>();

    public static void AddBarsCreator(ObservableCollection<Bar> bars, object creator)
    {
        lookupCreators.Add(bars, creator);
    }

    public static void Bars_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        ObservableCollection<Bar> bars = (ObservableCollection<Bar>)sender;
        if (lookupCreators.ContainsKey(bars))
        {

        }
    }
}

public class Foo
{
    public ObservableCollection<Bar> Bars { get; set; }

    public Foo()
    {
        Bars = new ObservableCollection<Bar>();
        HelperFoo.AddBarsCreator(Bars, this);
        Bars.CollectionChanged += HelperFoo.Bars_CollectionChanged;
    }
}
公共静态类HelperFoo
{
私有静态字典lookupCreators=new Dictionary();
公共静态无效AddBarsCreator(可观察的收集栏、对象创建者)
{
添加(条形图,创建者);
}
公共静态无效条\u CollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
ObservableCollection条=(ObservableCollection)发送方;
if(lookupCreators.ContainsKey(条))
{
}
}
}
公开课Foo
{
公共可观察集合栏{get;set;}
公共食物(
{
条=新的可观察集合();
AddBarsCreator(条,此);
Bars.CollectionChanged+=HelperFoo.Bars\u CollectionChanged;
}
}

您一直在引用
FooA
,但您的代码没有
FooA
。我猜你的意思是“Foo”。你的名字很难理解
Foo
Bar
将使这一点更具可读性。可能的副本不是一个精确的副本,但这将允许您识别调用构造函数的人。正如@JonB指出的,由于您的命名,您的问题非常混乱。如果您正在查找集合中正在修改/添加/删除的项,您应该使用NotifyCollectionChangedEventArgs@JonB:感谢链接,但我需要获取正在调用的对象的实例,该对象与collectionchanged相关,或者使用构造函数从中进行调用。“如果您的HelperFoo类需要对Foo执行某些操作,请将其传递给Foo,并让它自己订阅Bar事件。" ... 我有500个Foo实例,当Foo.bar集合发生更改时,所有实例都需要执行一个comon操作,因此我认为它的内存节省器应该有一个静态集合更改事件,而不是对每个实例或Foo都使用它,但遗憾的是,我需要一些关于Foo实例的信息来正确处理更改的集合中的逻辑。您仍然建议为每个Foo实例注册更改的集合吗?所有500个Foo是否都包含相同的Bar集合?或者也有500种不同的收藏?如果是这样的话,我几乎不认为500个代理订阅会有多大影响。500个不同的集合-项目在0到最多300之间