C# 开发社区对于声明全局 using 语句的 .cs 文件名是否达成共识?
我本来打算采用文件名 GlobalUsings.cs,但随后发现 VS2022 工具链在幕后创建了一个名为 MyProject.GlobalUsings.g.cs 的隐藏文件。这是为了支持称为隐式全局 using 指令的相关新 C# 10 功能。
Blazor 支持 .razor 文件的类似功能,并且 Blazor 解决方案模板会自动创建一个名为 _Imports.razor 的文件。该名称源自 Razor 语法,用于声明 using 引用。
作为创建我的 SimpleInjector 容器的一部分,我遵循了推荐的做法并调用container.Verify()
以检查我的类型注册是否有意义。
这工作得很好,并且发现了我犯的许多错误 - 但它也会产生我想清理的碎片。
我的一个类是单例事件中心,用于在其他瞬态组件之间路由消息;这些其他组件在其构造函数中接受事件中心,创建订阅以接收他们有兴趣接收的消息,然后Dispose()
在完成时创建订阅。
调用container.Verify()
创建每种对象中的一个,导致大量这些其他瞬态实例徘徊,因为事件中心仍然知道它们的订阅。
目前,我通过Verify()
在应用程序启动之前立即手动终止所有订阅来解决这个问题。然而,这感觉像是一个必须已经解决的问题,尽管我无法在文档、Stack Overflow 上或通过搜索找到答案。
也许使用有范围的生活方式是解决方案?它们似乎不相关,因为我正在构建 WPF 应用程序,但如果我知道答案,我就不会在这里问了!
1 月 12 日更新- 根据@steven 的要求,这里有一些代码来演示我的问题。
我尝试(但失败)用既可编译又足够短的内容来内联共享的东西来演示这个问题;相反,我展示了一些实际项目的代码摘录。如果您想查看整个内容,可以在 GitHub 上找到 WordTutor 项目。
在我的应用程序的核心,我有一个单例IReduxStore<T>
,它既封装了应用程序状态,又充当了一种事件中心。其他类订阅存储以便在应用程序状态更改时主动通知。
这是IReduxStore<T>
,精简到必需品:
// IReduxStore.cs
public interface IReduxStore<T>
{
T State { get; }
void Dispatch(IReduxMessage message);
IDisposable SubscribeToReference<V>(
Func<T, V?> referenceReader,
Action<V?> whenChanged)
where V : class, IEquatable<V>?;
}
Run Code Online (Sandbox Code Playgroud)
订阅落实IDisposable
作为确定性清理方便和习惯的方法时,不再需要预订。
商店注册为单例,绑定到特定类型的状态:
// Program.cs
container.RegisterSingleton<
IReduxStore<WordTutorApplication>,
ReduxStore<WordTutorApplication>>(); …
Run Code Online (Sandbox Code Playgroud) 我有一个依赖于源生成器才能正常工作的库。在 中MyLibrary.csproj
,我像这样引用生成器。
<ItemGroup>
<ProjectReference
Include="..\MyLibrary.Generators\MyLibrary.Generators.csproj"
PrivateAssets="contentfiles;build"
ReferenceOutputAssembly="false"
OutputItemType="analyzer"/>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我需要这个分析器引用是可传递的,即该引用的项目MyLibrary
应该可以MyLibrary.Generators
传递地获取分析器。
像这样的简单参考似乎没有参考分析器,只是 MyLibrary
<ProjectReference Include="..\MyLibrary\MyLibrary.csproj" />
Run Code Online (Sandbox Code Playgroud)
我想强调的是,我不是在寻找MyLibrary.Generators
作为常规程序集参考使用的,而是作为Roslyn 分析器使用的,因此我的源代码生成器可以在编译期间按预期运行。
是否可以switch expression
根据输入类型在 C# 8 中创建?
我的输入类如下所示:
public class A1
{
public string Id1 {get;set}
}
public class A2 : A1
{
public string Id2 {get;set}
}
public class A3 : A1
{
public string Id3 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想根据输入类型运行不同势方法(A1
,A2
,或A3
):
var inputType = input.GetType();
var result = inputType switch
{
inputType as A1 => RunMethod1(input); // wont compile,
inputType as A2 => RunMethod2(input); // just showing idea
inputType as A3 => RunMethod3(input);
}
Run Code Online (Sandbox Code Playgroud)
但它不会工作。任何想法如何根据输入类型创建 …