英文:
Generate compile-time error for a particular constructor overload invocation
问题
是否可以在整个解决方案中的任何地方访问构造函数的特定重载时,生成编译时警告/错误?
详细信息
这是一个WPF桌面(.NET 7)项目。我的页面和用户控件使用 d:DataContext="{d:DesignInstance Type=vm:UnderlyingVM}"
功能来利用设计时智能感知。然而,底层的 VM 需要在它们的构造函数中传递外部服务(标准 IoC/DI 部分),而设计师只能调用无参数构造函数。
为了解决这个问题,我在每个 VM 中定义了无参数构造函数的重载。这些重载的唯一目的和用途是设计时支持,不能在任何其他地方无意中调用这些重载。是否有一种方法可以在常规代码中发现这种调用时生成编译时警告/错误?
我考虑的一种方法是在无参数构造函数中使用以下代码:
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
#error ("此构造函数只能从 WPF 设计器中调用。");
}
不幸的是,VM 层是一个 .NET Standard 2.0 项目,因此无法引用 .NET 6/7 组件。是否有人能提出替代方法?
英文:
Is it possible to generate a compile-time warning/error if a particular overload of the constructor is accessed anywhere in entire solution?
Detail
This is a WPF desktop (.NET 7) project. My Pages and UserControls use d:DataContext="{d:DesignInstance Type=vm:UnderlyingVM}"
feature to take advantage of design-time intellisense. However, the underlying VMs require passing in external services (standard IoC/DI stuff) in their constructors, while the designer can invoke parameter-less constructors only.
To get around this problem, I have defined parameter-less constructor overloads in each VM. Sole purpose and usage of these overloads is the designer support and these overloads must not inadvertently be called from anywhere else. Is there a way to generate a compile-time warning/error if such an invocation is found anywhere in the regular code?
One approach that I thought of was use the following in the parameter-less constructor:
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
#error ("This constructor can only be invoked from the WPF designer.");
}
Unfortunately, the VM layer is a .NET Standard 2.0 project and therefore cannot reference .NET 6/7 assemblies. Can anyone suggest an alternate approach?
答案1
得分: 4
你可以使用 ObsoleteAttribute
:
public class Example
{
[Obsolete("此构造函数应仅由 WPF 设计器使用")]
public Example()
{
}
}
默认情况下,如果你调用带有此属性的方法,你将收到编译器警告。
英文:
You could use the ObsoleteAttribute
:
public class Example
{
[Obsolete("this constructor should only be used by the WPF designer")]
public Example()
{
}
}
By default, if you call a method with this attribute, you will get a compiler warning.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论