【发布时间】:2021-10-08 02:38:41
【问题描述】:
Asp.net MVC 在 Html 泛型类上引入了EditorFor 方法。它允许您编写简洁地标识视图模型字段的代码。在这种情况下,此代码所在的页面必须具有某种类型的视图模型,该模型具有 StudentId 属性,否则这将不起作用。
@Html.EditorFor(m => m.StudentId)
EditorFor 属性的签名是这样的。
EditorFor<TModel,TValue>(HtmlHelper<TModel>, Expression<Func<TModel,TValue>>)
该方法是在知道TModel 类型的泛型类型上定义的。所以 lambda 表达式可以像m => m.StudentId 一样简单,我们都知道m 的类型就是TModel 的类型。在这种情况下,它是页面的视图模型。
我希望能够编写类似的代码,但不知道该属性是在什么类型上定义的。我希望能够写...
@Html.EditorFor(M.StudentId) // here M is a type not a lambda parameter
@Html.EditorFor(X.Y) // here X is a type not a lambda parameter
我希望能够指定任意类型和任意参数,并使用可识别两者的方法调用该方法。例如,如果使用PropertyInfo 调用该方法,那么我可以同时看到属性和定义它的类型。
换一种说法...就像nameof(X.Y) 为任意类型X 提供一个字符串"Y" 一样,我也想要一个提供类似PropertyInfo 的表达式。也许property(X.Y) 并且你从X 类型中取回属性Y 的PropertyInfo。
【问题讨论】:
-
示例代码
CallMethodWithProperty(x => x.Y);没有证明对对象实例有任何需求...您能否澄清一下您在使用该行时遇到的确切问题(另请查看minimal reproducible example 发布代码指南- 添加额外的var x = new X()是完全没有必要的......而不是显示CallMethodWithProperty的定义可以改善问题 - 考虑edit 它) -
谢谢我更新了这个问题,以澄清和证明我在问什么。
-
还是不明白:
() => X.Y没有意义除非你有一个对象,要么来自封闭范围,要么作为参数传递X => X.Y -
OP,我认为您对 lambda 表达式实际表达的内容感到困惑。在您的第一个示例中,lambda 表达式中的
x不是您在上面使用new关键字创建的实例;它是表达式参数的声明,它成为表达式中的 new 局部变量。该实例未使用。
标签: c# asp.net .net lambda reflection