8

我正在使用 SimpleMembership 提供程序并添加要在注册时保存的其他字段。

为了在注册时保存其他字段,我使用到处使用的方法,例如使用 MVC 4、SimpleMembershipProvider、SimpleRoleProvider、Entity Framework 5 CodeFirst 和 Custom User Properties 的种子用户和角色

我使用在我的 HttpPost ActionResult Register 方法中调用的以下 SimpleMembership 提供程序方法。

WebSecurity.CreateUserAndAccount(registerModel.UserName, registerModel.Password,
    new { FirstName = registerModel.FirstName, LastName = registerModel.LastName, CompanyName = registerModel.CompanyName});

附加字段由对象类型的按值方法参数添加。对此的描述是“包含附加用户属性的字典”

这可行,但我安装了 JetBrains ReSharper 8,并且对于属性名称,我收到“冗余显式属性名称”警告。

要删除警告,我将代码更改为:

WebSecurity.CreateUserAndAccount(registerModel.UserName, registerModel.Password,
    new { registerModel.FirstName, registerModel.LastName, registerModel.CompanyName}); 

我的问题是:

1)对于这个匿名对象参数,我现在删除了属性名称,因此我不再收到 Resharper 警告,它如何知道属性名称将用于匹配 db 属性类,因为它们是按值传递的?

2)有或没有属性名称的最佳实践是什么。不包含它们不是很可读,并且在代码示例中指定了它们,所以我想将它们包含在可读性而不是删除它更好。

4

3 回答 3

13

我的问题是 1) 对于这个匿名对象参数,我现在删除了属性名称,因此我不再收到 Resharper 警告,它如何知道属性名称是什么,因为它们是按值传递的?

名称是从表达式中推断出来的(由编译器)。这仅在您使用字段或属性(例如,不是文字或方法)时才有效。这在 C# 语言规范的第 7.6.10 节中。

2)有或没有属性名称的最佳实践是什么。不包含它们不是很易读,并且在代码示例中指定了它们,因此我认为将它们包含在其中而不是删除它更好

如果您和您的团队始终包含名称更具可读性,那么请继续这样做。对于其他人来说,可能会觉得有点多余。只需调整您的 R# 设置以适应您当地的惯例。

您关于“在代码示例中指定它们”的论点是似是而非的——有些例子是指定的,有些例子不是。我怀疑即使在特定的示例提供程序中(例如在 MSDN 中),您也会发现一种混合。

于 2013-10-02T14:05:58.993 回答
3

当您设置您的propertyNames对象时,您正在创建一个匿名类型的实例 - 当您这样做时,如果它与您分配值的属性相同,您可以省略属性名称。这就是为什么 ReSharper 说这些名称是多余的。

不需要时明确说明属性名称是个人喜好;一旦您熟悉了上述约定,我认为它不会损害可读性。

于 2013-10-02T14:14:46.930 回答
1
  • 它如何知道属性名称将用于匹配 db 属性类,因为它们是按值传递的

简而言之,匿名类型是在编译时创建的。所以编译器使用传递的表达式解析属性名称,结果我们有一个带有声明readonly属性的匿名类。您可以检查您的 IL 以查看程序集是否包含此类型并且已明确设置属性。

  • 包含或不包含属性名称的最佳做法是什么

这取决于每个人。我建议为您的团队选择一种方式,并在每台开发人员机器上使用相同的 ReSharper 设置。

于 2013-10-02T14:15:57.737 回答