为什么我可以从 Fact 派生,而 Trait 是密封的?

Why can I derive from Fact, whereas Trait is sealed?

我正在考虑创建一个源自 Xunit.Trait 的属性,我可以用它来归因于我的事实。这个想法是将提供的类型的名称设置为特征值。沿着这些线的东西:

[Tests(typeof(Foo.Bar))] // would be equivalent to [Trait("Type", "Foo.Bar"]
[Fact]
public void TestsFooBarConstructor()
{
  var x = new Foo.Bar();
  // ...
}

知道 Xunit.Fact 属性可以进一步专门化,我希望它与 Trait 属性相同,并创建了以下属性 class

public class TestsAttribute : TraitAttribute
{
  public TestsAttribute(Type t)
    : base("Type", t.FullName)
  {
  }
}

直到我发现Trait被封了。有这样设计的理由吗?

通过查看测试而不是必须 运行 能够确定代码的意图,这意味着用户可以在调用编译器之前更早地理解测试意图。

许多新属性是密封的(而不是使用继承),因为他们希望能够使用自动化工具支持从环境中发现测试(代码甚至可能无法编译 ,所以它是用抽象语法树完成的)像 Resharper、CodeRush、Roslyn 等...

查看 xunit 贡献者的更多详细信息here