为了账号安全,请及时绑定邮箱和手机立即绑定

想要使Func <UnknownType,bool>其中UnknownType仅在运行时已知

想要使Func <UnknownType,bool>其中UnknownType仅在运行时已知

C#
素胚勾勒不出你 2021-04-29 14:10:45
因此,我正在尝试使用atm表达式。得到以下代码:除以下几点外,代码工作正常:我需要用ForeignKeyProperty.PropertyType替换ViewModel类型,该类仅在运行时在var condition = Expression.Lambda < Func < ViewModel, bool> >预期的最终结果:ForeignKeyProperty.SetValue(model, repository.GetList  <ForeignKeyProperty.PropertyType >().Single(x => x.Id == model.Id));protected List < Action < IVenturaRepository, ViewModel>> SetForeignKeyProperties<ViewModel>() where ViewModel : BaseViewModel        {            var viewModelType = typeof(ViewModel);            var foreignKeyProperties = viewModelType.GetProperties().Where(x => x.PropertyType.IsSubclassOf(typeof(BaseViewModel)));            var actions = new List < Action < IVenturaRepository, ViewModel>>();            var repositoryType = typeof(IVenturaRepository);            foreach(var ForeignKeyProperty in foreignKeyProperties)            {                var foreignKeyIdProperty = viewModelType.GetProperties().SingleOrDefault(x => x.Name == ForeignKeyProperty.Name + "Id");                //ForeignKeyProperty.SetValue(model, repository.GetList<ViewModel>().Single(x => x.Id == model.Id));                var listMethod = repositoryType.GetMethods().SingleOrDefault(x => x.Name == "GetList").MakeGenericMethod(ForeignKeyProperty.PropertyType);                //Expression.Call(singleMethod,);                var repositoryVariable = Expression.Parameter(repositoryType, "repository");                var paramViewModelType = Expression.Parameter(viewModelType, "model");                var paramForeignEntityId = Expression.Property(paramViewModelType, "Id");                var listMethodCall = Expression.Call(repositoryVariable, listMethod);                var modelParameter = Expression.Parameter(ForeignKeyProperty.PropertyType, "x");                var foreignKeyTypeConstant = Expression.Constant(ForeignKeyProperty.PropertyType);                       ),                        modelParameter                    );            }            return actions;        }有人可以指出我正确的方向吗?
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

使用Object作为类型。那么您可以在运行时以及在将类型强制转换为正确类型之后通过getType()检查类型。或使用动态以避免投射。


查看完整回答
反对 回复 2021-05-08
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信