C# 在MvvmCross&x27;我工作不正常

C# 在MvvmCross&x27;我工作不正常,c#,mvvmcross,C#,Mvvmcross,上下文: 我有一个未知的模型对象,它包含一个或多个可观察集合。 这些集合包含实现INotifyPropertyChanged的对象。 现在我想观察模型对象中所有对象的PropertyChangedEvents 我所做的: 所以我写了这个方法,它使用反射来找到特定的对象。这一切都很好。除了涉及MvvmCross函数WeakSubscribe的部分。我真的很喜欢背后的想法,但它似乎失去了参考,没有引发事件 奇怪:如果我调试这段代码,它可以正常工作,但是如果没有断点,它就不能工作 privat

上下文:

我有一个未知的模型对象,它包含一个或多个可观察集合。 这些集合包含实现INotifyPropertyChanged的对象。 现在我想观察模型对象中所有对象的PropertyChangedEvents

我所做的:

所以我写了这个方法,它使用反射来找到特定的对象。这一切都很好。除了涉及MvvmCross函数WeakSubscribe的部分。我真的很喜欢背后的想法,但它似乎失去了参考,没有引发事件

奇怪:如果我调试这段代码,它可以正常工作,但是如果没有断点,它就不能工作

    private void SubscribeToDetailData()
    {
        var tempTokenList = new List<MvxNotifyPropertyChangedEventSubscription>();

        var fieldInfos =
            DetailData.GetType().GetRuntimeProperties().Where(f => Helpers.IsSubclassOfRawGeneric(typeof (ObservableCollection<>), f.PropertyType));

        foreach (var fieldInfo in fieldInfos)
        {
            var collection = fieldInfo.GetValue(DetailData) as IEnumerable<object>;
            if (collection == null) 
                continue;

            foreach (var inpc in collection.Cast<INotifyPropertyChanged>())
            {
                tempTokenList.Add(inpc.WeakSubscribe((sender, e) =>  DetailDataPropertyChanged(e.PropertyName))); 
            }
        }
        _subscriptionTokens = tempTokenList.ToArray();
    }

    // This method is never raised
    private void DetailDataPropertyChanged(string propertyName)
    {
        
        if (_enabledFields.Evaluate(DetailData, propertyName))
             RaisePropertyChanged(() => FieldEnabledState);
    }
private void SubscribeToDetailData()
{
var testokenlist=新列表();
var fieldInfos=
DetailData.GetType().GetRuntimeProperties()。其中(f=>Helpers.IsSubclassOfRawGeneric(typeof(observeCollection),f.PropertyType));
foreach(fieldInfo中的var fieldInfo)
{
var collection=fieldInfo.GetValue(DetailData)作为IEnumerable;
if(集合==null)
继续;
foreach(collection.Cast()中的var inpc)
{
添加(inpc.WeakSubscribe((sender,e)=>DetailDataPropertyChanged(e.PropertyName));
}
}
_subscriptionTokens=testokenlist.ToArray();
}
//这种方法从未被提出过
私有void DetailDataPropertyChanged(字符串propertyName)
{
if(_enabledFields.Evaluate(DetailData,propertyName))
RaisePropertyChanged(()=>FieldEnabledState);
}

您订阅的
操作可能正在被垃圾回收

我认为,如果编译器创建一个匿名类的实例来实现您的匿名
操作
,可能会导致这种情况。我通常不希望这种情况发生在代码中,因为在
操作中没有使用任何局部变量,但可能是这样

如果将订阅更改为:

tempTokenList.Add(inpc.WeakSubscribe(DetailDataPropertyChanged)); 
方法签名更改为:

private void DetailDataPropertyChanged(object sender, PropertyChangedEventArgs e)

可能是您订阅的
操作
正在被垃圾回收

我认为,如果编译器创建一个匿名类的实例来实现您的匿名
操作
,可能会导致这种情况。我通常不希望这种情况发生在代码中,因为在
操作中没有使用任何局部变量,但可能是这样

如果将订阅更改为:

tempTokenList.Add(inpc.WeakSubscribe(DetailDataPropertyChanged)); 
方法签名更改为:

private void DetailDataPropertyChanged(object sender, PropertyChangedEventArgs e)

可能是您订阅的
操作
正在被垃圾回收

我认为,如果编译器创建一个匿名类的实例来实现您的匿名
操作
,可能会导致这种情况。我通常不希望这种情况发生在代码中,因为在
操作中没有使用任何局部变量,但可能是这样

如果将订阅更改为:

tempTokenList.Add(inpc.WeakSubscribe(DetailDataPropertyChanged)); 
方法签名更改为:

private void DetailDataPropertyChanged(object sender, PropertyChangedEventArgs e)

可能是您订阅的
操作
正在被垃圾回收

我认为,如果编译器创建一个匿名类的实例来实现您的匿名
操作
,可能会导致这种情况。我通常不希望这种情况发生在代码中,因为在
操作中没有使用任何局部变量,但可能是这样

如果将订阅更改为:

tempTokenList.Add(inpc.WeakSubscribe(DetailDataPropertyChanged)); 
方法签名更改为:

private void DetailDataPropertyChanged(object sender, PropertyChangedEventArgs e)

如果您可以添加更多关于您在哪些平台和编译器上看到此内容的信息(标记?),这会有所帮助。如果您可以添加更多关于您在哪些平台和编译器上看到此内容的信息(标记?),这会有所帮助。如果您可以添加更多信息(标记?),这会有所帮助关于您在哪些平台和编译器上看到这一点。如果您可以添加更多关于您在哪些平台和编译器上看到这一点的信息(标记?),这会有所帮助。这样它就可以工作了。但我想在这个动作中使用局部变量。这可能吗?谢谢。是的-但您需要存储对
操作的强引用,其中局部变量导致订阅被垃圾收集,这就是它的工作方式。但我想在这个动作中使用局部变量。这可能吗?谢谢。是的-但您需要存储对
操作的强引用,其中局部变量导致订阅被垃圾收集,这就是它的工作方式。但我想在这个动作中使用局部变量。这可能吗?谢谢。是的-但您需要存储对
操作的强引用,其中局部变量导致订阅被垃圾收集,这就是它的工作方式。但我想在这个动作中使用局部变量。这可能吗?谢谢。是的-但是您需要存储对
操作的强引用
somewhereLocal变量导致我的订阅也被垃圾收集