我正在使用SimpleMembership提供程序并添加其他字段以便在注册时保存。
要在注册时保存其他字段,请使用在任何地方使用的方法,例如: Link
我使用我的HttpPost ActionResult Register方法中调用的以下SimpleMembership提供程序方法
WebSecurity.CreateUserAndAccount(registerModel.UserName, registerModel.Password,
new { FirstName = registerModel.FirstName, LastName = registerModel.LastName, CompanyName = registerModel.CompanyName});
其他字段由object类型的by值方法参数添加。对此的描述是“包含其他用户属性的字典”
这样可行。
我的问题是我安装了Jetbrains Resharper 8,对于属性名称,我得到了“冗余显式属性名称”警告。 要删除警告,我更改我的代码将如下所示:
WebSecurity.CreateUserAndAccount(registerModel.UserName, registerModel.Password,
new { registerModel.FirstName, registerModel.LastName, registerModel.CompanyName});
我的问题是 1)对于这个匿名对象参数,我现在删除属性名称,所以我不再得到Resharper警告,它是如何知道属性名称将用于匹配db属性类,因为它们是按值传递的?
2)具有或不具有属性名称的最佳实践是什么。没有它们是不可读的,并且在代码示例中它们被指定,所以我认为将它们放入可读性更好而不是删除它
答案 0 :(得分:10)
我的问题是1)对于这个匿名对象参数,我现在删除属性名称,所以我不再得到Resharper警告,它是如何知道属性名称是什么,因为它们是按值传递的?
从表达式推断(由编译器)名称。这仅适用于您使用字段或属性(例如,不是文字或方法)。这是C#语言规范的第7.6.10节。
2)具有或不具有属性名称的最佳实践是什么。没有它们是不是非常易读,并且在代码示例中它们被指定,所以我认为让它们更好而不是删除它
如果您和您的团队始终包含该名称更具可读性,那么请继续这样做。对于其他人来说,可能会感到有点多余。只需调整您的R#设置即可符合您当地的惯例。
你在“在代码示例中指定它们”的论点虽然有点似乎 - 有一些例子指出了它们,有些则指出它们不是。我怀疑你甚至会在特定的示例提供程序中找到混合物(例如在MSDN中)。
答案 1 :(得分:2)
当您设置propertyNames
对象时,您正在创建一个匿名类型的实例 - 当您这样做时,您可以省略属性名称,如果它与您分配属性的属性相同值。这就是为什么ReSharper说这些名字是多余的。
当您不需要时,明确说明属性名称是个人偏好;一旦你熟悉上述惯例,我认为它不会损害可读性。
答案 2 :(得分:0)
它是如何知道属性名称将用于匹配db属性类的,因为它们是按值传递的
在一个nuthel中,在编译时创建了无数类型。因此编译器使用传递的表达式解析属性名称,并且在结果中我们有一个具有声明的readonly属性的anonimous类。您可以检查IL以查看程序集包含此类型,并且属性设置为明确。
在