【发布时间】:2014-08-10 22:57:58
【问题描述】:
如果我有这样的 POCO:
[Poco]
public class MyPoco
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
}
...它的初始化如下:
new MyPoco { FirstName = "Joe", LastName="Bloggs", Address="123 Abc St." }
我能否在 NDepend 中使用 CQL,确保属性只使用上面的对象初始化器设置,而不是单独设置。
我正在尝试捕获这样的代码:
myPoco.FirstName="John";
doSomething(myPoco);
...我不希望人们在现有 POCO 上设置属性。我知道我可以设置设置器private,但我不喜欢在构造函数中传递所有属性,因为你最终会得到一个签名,例如MyPoco(string, string, string) - 使得参数错位更容易(比使用对象初始化语法)
所以,我想使用 NDepend 来捕捉它。这是我的 CQL 查询的开始:
from f in JustMyCode.Fields.Where(f=>
f.ParentType.HasAttribute ("JetBrains.Annotations.PocoAttribute".AllowNoMatch()))
where f.MethodsAssigningMe [I'M STUMPED HERE]
看起来我可以分析设置 POCO 属性的方法,但我需要再往下一步检查代码块,看看它是否在对象初始化程序块中。 p>
这可能吗?
【问题讨论】:
-
在 C# 中,接下来这将是一个“事物”(主构造函数)。在当前的 C# 中,您需要编写显式属性来执行此操作。
-
命名参数怎么样。您可以将设置器设置为私有并使用 var myPoco = new MyPoco(firstName: "", lastName: "", address: "");
-
@MarcGravell:主要构造函数在调用代码方面无济于事,不是吗?据我所知,您将无法使用对象初始化器语法来创建实例。
-
@MarcGravell:同意,我对此感到非常高兴——但我认为这与本案中的问题并不特别相关。 (OP 声明反对将东西放入构造函数中并不是必须编写手动属性和单独的只读变量的丑陋。)
-
使用 NDepend,您可以编写规则以确保如果方法使用 POCO 类的 setter,则它使用 POCO 类的所有 setter。但是你不能强制在对象初始化器中调用所有这些设置器。
标签: c# poco code-analysis cql ndepend