当前位置: 首页 > 编程语言 > C#

在不知道目标类型的情况下在编译时设置属性分享

时间:2023-04-11 00:52:55 C#

在不知道目标类型的情况下在编译时设置属性我想在不知道目标类型的情况下在对象上设置属性值;我想要它快(即不要每次都使用反射);我知道属性名称和类型。最快的方法(afaik)是使用委托;所以这就是我到目前为止所拥有的:类用户//这是一个例子..假设我不知道这是哪种类型。{publicstringName{get;set;}}publicstaticActionCreatePropertySetter(TypetargetType,stringpropertyName){ParameterExpressiontargetObjParamExpr=Expression.Parameter(targetType);ParameterExpressionvalueParamExpr=Expression.Parameter(targetType.GetProperty(propertyName).PropertyType););BinaryExpressionassignExpr=Expression.Assign(targetObjParamExpr,valueParamExpr);动作结果=Expression.Lambda(assignExpr,targetObjParamExpr,valueParamExpr).Compile();返回结果;然后我调用:Useruser=newUser();varuserNameSetter=CreatePropertySetter(user.GetType(),"名称");userNameSetter(用户,“鲍勃”);但是,它不喜欢我传递的是用户类型的对象而不是对象,并且失败并显示“UserExpression类型”用户“不能用于类型”System.Object“的委托参数。我是表达树的新手,所以在这里有点迷路。为什么不能将User转换为对象?我需要某个演员吗?“行动”也不好看;最好返回一个带有参数(用户用户,字符串属性值)的委托。同样,不确定如何实现这一目标。实际上,我已经尝试过使用Delegate.CreateDelegate,但它使用.Invoke()方法调用,速度很慢(这是唯一的方法吗?);与Expression.Lambda(非泛型)相同。有任何想法吗?另外,是否有关于表达式树的良好(比MSDN更好)的文档?msdn版的实在是太缺乏细节了。如果你想使用Expression那么:Convert...staticvoidMain(){varsetter=CreatePropertySetter(typeof(User),"Name");varobj=newUser();设置器(对象,“弗雷德”);}publicstaticActionCreatePropertySetter(TypetargetType,stringpropertyName){vartarget=Expression.参数(类型(对象),“对象”);变量值=表达式。参数(类型(对象),“值”);varproperty=targetType.GetProperty(propertyName);varbody=Expression.Assign(Expression.Property(Expression.Convert(target,property.DeclaringType),property),Expression.Convert(value,property.PropertyType));varlambda=Expression.Lambda>(body,target,value);返回拉姆达。编译();}然而!您可能想看看FastMember(也可在NuGet上获得),它可以非常方便地为您完成所有这些工作(并且使用原始IL来实现愚蠢的疯狂)。如果你想使用有类型的委托,你需要提前知道类型。如果你知道类型,你可以添加一些泛型:以上是C#学习教程:在不知道目标类型的情况下在编译时设置属性。全部内容分享出来,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注—staticvoidMain(){varsetter=CreatePropertySetter("Name");varobj=newUser();设置器(对象,“弗雷德”);}publicstaticActionCreatePropertySetter(stringpropertyName){vartarget=Expression。参数(类型(TType),“obj”);varvalue=Expression.Parameter(typeof(TValue),"value");varproperty=typeof(TType).GetProperty(propertyName);varbody=Expression.Assign(Expression.Property(target,property),value);varlambda=Expression.Lambda>(body,target,value);返回lambda.Compile();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: