gpt4 book ai didi

c# - 在多个命名空间中可用的相同扩展类

转载 作者:行者123 更新时间:2023-12-04 17:00:18 25 4
gpt4 key购买 nike

在 MVC 应用程序中,我有一个包含特定模型类的命名空间。这个类实现了一个特定的接口(interface),并且该接口(interface)有一个扩展类。

我将扩展类放在与模型类和接口(interface)相同的命名空间中,但是,除非我在 View 中公开命名空间,否则扩展方法将无法在 View 中工作。通过 using 添加命名空间在实际要使用这些扩展方法的每个 View 中都不是一个选项。谢天谢地I know how to globally add a namespace so it can be used inside all of views ,但我有理由不向他们公开我的模型命名空间。

考虑到这一点,我正在考虑将扩展方法移动到不同的命名空间,以便我可以安全地将其公开给我的所有 View ,但是现在所有有权访问模型命名空间的 Controller 都将缺少扩展。我不想将这个命名空间添加到我所有的 Controller 中,这次我不想让这个命名空间全局可用。如果仅将模型命名空间暴露给代码,我确实希望扩展可用。

廉价的解决方案是将相同的扩展类添加到两个命名空间(换句话说,两个具有完全相同代码的 cs 文件)并完成它,但如果可能,我想使用更好的解决方案。

有一段时间我以为我可以在另一个命名空间中继承扩展类,但这不起作用,因为静态类不能继承任何东西。

我也尝试使用 this解决方案,但它不起作用(至少对于扩展类)。我的意思是我公开了仅包含 View 扩展的命名空间,但我的 View 中的对象无权访问扩展方法。我还必须向命名空间添加一个虚拟类(否则应用程序甚至不会注意到命名空间)。

总而言之,我有一个扩展类,我需要在两个不同的命名空间中使用它。除了将所述类复制粘贴到另一个命名空间之外,还有其他方法可以实现吗?

最佳答案

当然,您不能在两个命名空间中拥有相同的类,但是您可以让相同的代码生成两个类。

一种方法是使用 T4 生成一个包含两个类的文件。 (您可能不熟悉 T4。如果您使用 Entity Framework,即使您不知道它,您的项目中也有它。)

在命名空间上使用 foreach 将文本模板 (.tt) 文件添加到您的项目,如下所示:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>

using System;
using System.Collections.Generic;
using System.Globalization;

<#
foreach (var @namespace in new [] { "One.Two", "First.Second" })
{
#>
namespace <#= @namespace #>
{
public static class UsefulExtensions
{
public static IEnumerable<String> ToTextElements(this String str)
{
var iter = StringInfo.GetTextElementEnumerator(str);
while (iter.MoveNext())
{
yield return iter.GetTextElement();
}
}
}
}

<#
}
#>

或者,您可以通过将扩展名更改为 .tt 并将 CustomTool 属性设置为 TextTemplatingFileGenerator 并将 Build Action 属性设置为 None 来转换 .cs 文件。

关于c# - 在多个命名空间中可用的相同扩展类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com