C# 为什么我可以从事实中推断,而特质是封闭的?

C# 为什么我可以从事实中推断,而特质是封闭的?,c#,inheritance,xunit,C#,Inheritance,Xunit,我在考虑创建一个属性,该属性派生自Xunit.Trait,我可以用它来属性我的事实。其思想是将提供的类型的名称设置为trait值。大致如下: [Tests(typeof(Foo.Bar))] // would be equivalent to [Trait("Type", "Foo.Bar"] [Fact] public void TestsFooBarConstructor() { var x = new Foo.Bar(); // ... } 知道Xunit.Fact属性可以进一步

我在考虑创建一个属性,该属性派生自
Xunit.Trait
,我可以用它来属性我的事实。其思想是将提供的类型的名称设置为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
属性相同,并创建了以下属性类

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

直到我发现,
Trait
是密封的。这种设计有什么原因吗?

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

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


查看xunit贡献者提供的更多详细信息,通过查看测试而不是运行测试来确定代码的意图,这意味着用户可以在调用编译器之前更早地理解测试意图

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


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

工具可以查找属性类型或从属性类型派生的属性类型。可行,但工具方面可能存在性能问题?@David他们可以看到
TestsAttribute
来自
TraitsAttribute
,但不运行它,他们将无法看到您传递给基类构造函数的参数。工具可能会查找属性类型或从中派生的属性类型。可行,但工具方面可能存在性能问题?@David他们可以看到
TestsAttribute
是从
TraitsAttribute
派生的,但是如果不运行它,他们将无法看到您传递给基类构造函数的参数。