微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

System.NotSupportedException:“常量”类型的表达式不受支持您是否错过了表达式中的成员访问前缀?

如何解决System.NotSupportedException:“常量”类型的表达式不受支持您是否错过了表达式中的成员访问前缀?

我在基于 ReactiveUI 的 viewmodel 中收到以下异常...

System.NotSupportedException:不支持的类型表达式 '持续的'。您是否错过了表达式中的成员访问前缀?

错误发生在 ValidationEditorDocumentviewmodel 的构造函数中,在一个可观察的管道中,该管道旨在监视另一个 Reactive viewmodel (SelectedValidatorClientviewmodel) 中的属性 (SelectedValidatorClientviewmodel) 的变化>ValidationEditorviewmodel).

我想要做的是,只要 ValidationEditorviewmodel.SelectedValidatorClientviewmodel 属性发生变化,然后在另一个 viewmodel (RuleEditorviewmodel) 上设置 SelectedValidator

using NextWare.ProductPortalUI.RXviewmodels.RXviewmodels.ValidationEditor;
using ReactiveUI;
using System;

namespace NextWare.ProductPortalUI.RXviewmodels.ValidationEditor
{
    public sealed partial class ValidationEditorDocumentviewmodel: ReactiveObject 
    {
 
        private ValidatorEditorviewmodel _validationEditorviewmodel;
        private RuleEditorviewmodel _ruleEditorviewmodel;
      
        public ValidationEditorDocumentviewmodel() 
        {
            var setValidatorRuleSet = this.WhenAnyValue(x => ValidationEditorviewmodel.SelectedValidatorClientviewmodel)
                .Subscribe(_ => SetValidatorOnRuleSet());
        }

        private void SetValidatorOnRuleSet()
        {
            if(RuleEditorviewmodel != null)
            {
                RuleEditorviewmodel.SelectedValidator = _validationEditorviewmodel.SelectedValidatorClientviewmodel.Validator;
            }
        }

        public ValidatorEditorviewmodel ValidationEditorviewmodel
        {
            get => _validationEditorviewmodel;
            set => this.RaiseAndSetIfChanged(ref _validationEditorviewmodel,value,nameof(ValidationEditorviewmodel));
        }
 
    }
}

这是引用的viewmodel ...

using NextWare.Domain.ValidationServices.Validator.Clientviewmodels;
using NextWare.ProductPortalUI.SharedComponents.DomainMetaExplorer.Models;
using ReactiveUI;
using Splat;
using System;
 

namespace NextWare.ProductPortalUI.RXviewmodels.RXviewmodels.ValidationEditor
{
    public sealed partial class ValidatorEditorviewmodel : ReactiveObject 
    {
        private ValidatorsClientviewmodel _validatorsClientviewmodel; // Contructor Injected Domain-based viewmodel
        private ValidatorClientviewmodel _selectedValidatorClientviewmodel;
        private Guid _selectedDomainElementModelReferenceId = Guid.NewGuid();
        private TreeNode _selectedMetaExplorerTreeNode;

        public ValidatorEditorviewmodel(ValidatorsClientviewmodel validatorsClientviewmodel = null)
        {
            _validatorsClientviewmodel = validatorsClientviewmodel ?? Locator.Current.GetService<ValidatorsClientviewmodel>();
            
            this.WhenAnyValue(x => x.SelectedValidatorClientviewmodel)
                          .Subscribe(_ => SetValidator());

            this.WhenAnyValue(x => x.SelectedMetaExplorerTreeNode)  // Happens only once at startup
                        .Subscribe(_ => SetValidator());
            
        }

        private void SetValidator()
        {
            if(SelectedValidatorClientviewmodel != null && SelectedMetaExplorerTreeNode != null)
            {
                SelectedValidatorClientviewmodel.Validator.DomainElementName = SelectedMetaExplorerTreeNode.ModelMetaData.Name;
                SelectedValidatorClientviewmodel.Validator.DomainElementNameSpace = SelectedMetaExplorerTreeNode.ModelMetaData.FqviewmodelName;
                SelectedValidatorClientviewmodel.Validator.DomainElementModelReferenceId = SelectedMetaExplorerTreeNode.ModelMetaData.ModelReferenceId;
                SelectedValidatorClientviewmodel.Validator.AggregateRootModelReferenceId = SelectedMetaExplorerTreeNode.ParentModelMetaData.ModelReferenceId;
            }
        }

        public ValidatorsClientviewmodel ValidatorsClientviewmodel
        {
            get => _validatorsClientviewmodel;
            private set => this.RaiseAndSetIfChanged(ref _validatorsClientviewmodel,nameof(ValidatorsClientviewmodel));
        }
              
        public ValidatorClientviewmodel SelectedValidatorClientviewmodel
        {
            get => _selectedValidatorClientviewmodel;
            set => this.RaiseAndSetIfChanged(ref _selectedValidatorClientviewmodel,nameof(SelectedValidatorClientviewmodel));
        }
        public TreeNode SelectedMetaExplorerTreeNode
        {
            get => _selectedMetaExplorerTreeNode;
            set => this.RaiseAndSetIfChanged(ref _selectedMetaExplorerTreeNode,nameof(SelectedMetaExplorerTreeNode));
        }
    }
}

从文档中,WhenAnyValue 从 IObservableChanged提取值,据我所知,只有在 ValidationEditorviewmodel 不为空时才会通过,无论 SelectedValidatorClientviewmodel 是否为空。

我很困惑为什么会抛出这个异常。

解决方法

正如 Anthony 在评论中提到的

改变

var setValidatorRuleSet = this.WhenAnyValue(x => ValidationEditorViewModel.SelectedValidatorClientViewModel)
                .Subscribe(_ => SetValidatorOnRuleSet());

var setValidatorRuleSet = this.WhenAnyValue(x => x.ValidationEditorViewModel.SelectedValidatorClientViewModel)
                .Subscribe(_ => SetValidatorOnRuleSet());

x 之前加上额外的 ValidationEditorViewModel

WhenAnyValue 依赖于您拥有从“x”到您的财产的 lambda。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。