从Lambda属性表达式获取自定义属性我正在使用ASP.NETMVC2Preview2并编写了一个自定义HtmlHelper扩展方法来使用表达式创建标签。TModel来自一个具有属性的简单类,这些属性可以具有定义验证要求的属性。我试图找出某个属性是否存在于由我的标签方法中的表达式表示的属性上。类和标签的代码是:publicclassMyViewModel{[Required]publicstringMyProperty{get;放;}}publicstaticMvcHtmlStringLabel(thisHtmlHelperhtmlHelper,Expressionexpression,stringlabel){returnMvcHtmlString.Create(string.Concat("",label,""));}publicstaticstringGetInputName(thisExpressionexpression){returnexpression.Body.ToString().Substring(expression.Parameters[0].Name.Length+1);我会这样调用标签:Html.Label(x=>x.MyProperty,"MyLabel")有没有办法查明传递给Label方法的表达式值中的属性是否具有Required属性?我发现执行以下操作确实可以获得该属性(如果它存在),但我希望有一种更简洁的方法来执行此操作。publicstaticMvcHtmlStringLabel(thisHtmlHelperhtmlHelper,Expressionexpression,stringlabel){System.Attribute.GetCustomAttribute(Expression.Property(Expression.Parameter(expression.Parameters[0].Type,expression.GetInputName()),表达式.GetInputName()).Member,typeof(RequiredAttribute))returnMvcHtmlString.Create(string.Concat("",label,""));您的表达式解析逻辑可能需要一些工作。您正在转换为字符串而不是处理实际类型。下面是一组您可以使用的扩展方法。第一个获取成员的姓名。检查属性是否在成员上的第二个/第三个组合。GetAttribute将返回请求的属性或null,IsRequired仅检查该特定属性。publicstaticclassExpressionHelpers{publicstaticstringMemberName(thisExpression>expression){varmemberExpression=expression.BodyasMemberExpression;if(memberExpression==null)thrownewInvalidOperationException("表达式必须是成员表达式");返回memberExpression.Member.Name;}publicstaticTGetAttribute(thisICustomAttributeProviderprovider)whereT:Attribute{varattributes=provider.GetCustomAttributes(typeof(T),true);返回attributes.Length>0?属性[0]为T:空;}publicstaticboolIsRequired(thisExpression>expression){varmemberExpression=expression.BodyasMemberExpression;if(memberExpression==null)thrownewInvalidOperationException("表达式必须是成员表达式");返回memberExpression.Member.GetAttribute()!=null;}}希望这会帮助你。这段代码怎么样(来自codeplex上的MVC项目)以上是C#学习教程:从LambdaPropertyExpression获取自定义属性共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—publicstaticboolIsRequired(thisExpression>expression,HtmlHelperhtmlHelper){varmodelMetadata=ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData);stringmodelName=htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.Get));FieldValidationMetadatafieldMetadata=ApplyFieldValidationMetadata(htmlHelper,modelMetadata,modelName);foreach(variteminfieldMetadata.ValidationRules){if(item.ValidationType=="required")返回真;}返回假;,ModelMetadatamodelMetadata,stringmodelName){FormContextformContext=htmlHelper.ViewContext.FormContext;FieldValidationMetadatafieldMetadata=formContext.GetValidationMetadataForField(modelName,true/*createIfNotFound*/);//将规则写入上下文对象IEnumerablevalidators=ModelValidatorProviders.Providers.GetValidators(modelMetadata,htmlHelper.ViewContext);foreach(ModelClientValidationRuleruleinvalidators.SelectMany(v=>v.GetClientValidationRules())){fieldMetadata.ValidationRules.Add(rule);}返回字段元数据;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: