是否可以进行相对的C#命名空间引用

本文关键字:命名空间 引用 相对 是否 | 更新日期: 2023-09-27 18:20:47

我有命名空间:

MyProject.Core.Db
MyProject.Core.Model

我有课程:

MyProject.Core.Db.User
MyProject.Core.Model.User

有可能是这样的吗:

using MyProject.Core;
namespace MyProject.BLL
{
    public class Logic
    {
        public static void DoSomething()
        {
            var userEntity = new Db.User();
            var userModel = new Model.User();
        }
    }
}

我只是想避免在类名(UserModel、UserEntity)中使用后缀。

有可能在C#中以某种方式执行吗?

是否可以进行相对的C#命名空间引用

我不明白为什么人们说这是不可能的。当然,这是可能的,当你创建目标类时,你只需要在名称空间中更加具体一点(即你可以只省略名称空间的公共部分):

namespace MyProject.Core.Db
{
    public class User
    {
    }
}
namespace MyProject.Core.Model
{
    public class User
    {
    }
}
namespace MyProject.BLL
{
    public class Logic
    {
        public static void DoSomething()
        {
            var foo = new Core.Db.User();
            var boo = new Core.Model.User();
        }
    }
}

避免在BLL中使用完全限定名称的方法是与其他两个名称空间在一个公共名称空间内。

您想要实现的目标是不可能的。你将得到的最接近的东西是一个使用别名指令,它看起来像这样:

using User = Myproject.Core.Db.User;

这将消除完全限定Myproject.Core.Db.User的路径的需要。不过,您仍然需要为至少一个类指定完全限定的路径。正如Servy所展示的,您可以为另一种类型创建另一个别名,但此时我只需要重命名这些类。

我认为这里真正的解决方案是为类提供更多描述性标识符。

C#确实支持相对命名空间引用。

在您的情况下,这意味着如果您在名称空间MyProject.Core中,您可以将类引用为Db.UserModel.User。但是,如果您在名称空间MyProject.BLL中,则必须包含Core前缀(Core.Db.UserCore.Model.User)。

如果这对您来说还不够好,并且您不想更改命名空间结构,那么您的最佳选择可能是将using添加到所有使用相关类型的文件中。

using DbUser = MyProject.Core.Db.User;
using ModelUser = MyProject.Core.Model.User;

您可以做的一件事,我们可能还应该做更多的事情,就是指定相对于当前命名空间的usings。要做到这一点,只需在命名空间声明中移动using即可。它并不能解决你所说的问题,但较短的相对路径不那么脆弱,你的项目也更容易重构。

namespace MyProject.Core{
    using Db;
    using Model;

您可以为一个没有导入名称空间的类添加一个别名:

using MyProject.Core.Db;
using ModelUser = MyProject.Core.Model.User;
namespace MyProject.BLL
{
    public class Logic
    {
        public static void DoSomething()
        {
            var userEntity = new User();
            var userModel = new ModelUser();
        }
    }
}

在C#中,不可能使用所示的示例;它根本不是一个受支持的功能。