有什么方法可以创建一个不在发布模式下编译的“仅调试”构造器?
到目前为止,我找到了两个解决方案:
理想情况下,与Conditional相同但具有扩展范围的属性会很棒。
感谢您的帮助。
public class Foo
{
/// <summary>
/// Main constructor
/// </summary>
public Foo(){}
/// <summary>
/// Debug only constructor
/// </summary>
[Conditional("DEBUG")] //does not compile, wished behavior
internal Foo(bool dummy){}
}
编辑
正如下面的Chen Chen和Erik Philips所指出的那样,这个问题是XY问题。 更广泛的情况是:我的主要构造函数从Internet上加载大量资源。但是我想使用加载伪值的快速加载构造函数进行调试,仅测试特定功能。我通过创建一个虚拟类而不是工作类的虚拟构造函数来解决它。对于这个问题可能有更好的解决方案。
所以,最重要的是:
答案 0 :(得分:0)
您遇到的问题比Conditional
属性
您不能拥有2个具有相同签名的构造器 ...无论如何(我确定这只是一个错字),让我们看看文档
属性'attribute'在此声明类型上无效。它是 仅对“类型”声明有效。
定义属性时,定义它可以是什么构造 通过指定AttributeTargets值应用于。在下面的 例如,MyAttribute属性只能应用于接口, 因为AttributeUsage属性指定 AttributeTargets.Interface。产生错误的原因是 属性应用于一个类(A类)。
恰好发生ConditionalAttribute
定义如下
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
确定如何使用自定义属性类。 AttributeUsageAttribute是您应用于自定义属性的属性 定义。 AttributeUsage属性使您可以控制:
- 可以应用哪个程序元素属性。除非您限制其用法,否则属性可以应用于以下任何程序元素:程序集,模块,字段,事件,方法,参数,属性,返回,类型
- 一个属性是否可以多次应用于一个程序元素。
- 属性是否被派生类继承。
因此,查看文档,您无法在构造函数上使用此 Attribute 。
但是,您可以使用编译器指令
当C#编译器遇到
#if
指令时,最终 通过#endif
指令,它将编译指令之间的代码 仅在定义了指定符号的情况下。
public class Foo
{
public Foo() { }
#if DEBUG
internal Foo2(Something something) { }
#endif
}
或
public class Foo
{
#if DEBUG
public Foo() { }
#else
public Foo() { }
#endif
}
答案 1 :(得分:0)
您可以尝试使用partial类。
基本上,您将类分为两个文件。一个用于常规实现,另一个用于仅调试实现,该实现包装在#if DEBUG
编译器指令中。
// Foo.cs
public partial class Foo
{
/// <summary>
/// Main constructor
/// </summary>
public Foo(){}
}
// Foo.Debug.cs
public partial class Foo
{
#if DEBUG
/// <summary>
/// Debug only constructor
/// </summary>
internal Foo(bool dummy){}
#endif
}
这样,您可以组织所有不会在发布模式下编译到同一文件中的方法,成员等。
答案 2 :(得分:0)
这个要求对我来说似乎很奇怪。我认为,如果从一开始就进行解释,您会得到更好的答案,当前的问题更像是对原始要求的尝试解决方案。
要直接回答您的问题,我们可以在这里使用工厂。
public class Foo
{
private Foo(){}
private Foo(bool dummy){}
public static Foo FromNormal() { }
#if DEBUG
public static Foo FromDummy(bool dummy) { }
#endif
}