首页 新闻 会员 周边 捐助

C# 能否把一个类转移到另一个命名空间

0
悬赏园豆:15 [已解决问题] 解决于 2014-09-28 19:11

我现在有个类 A ,他在 B 命名空间。我想在使用 C 命名空间时也能使用类 A,而不必再调用一次 B 命名空间。C# 应该怎么实现这种效果?

Ten_cnblogs的主页 Ten_cnblogs | 初学一级 | 园豆:21
提问于:2014-09-27 10:17
< >
分享
最佳答案
0

这个是不可能的。

一个对象是不可能有两个不同的命名空间的,所以你的方案不可行。

至于在不同的,名称空间定义完全相同的类,看起来是完全相同的,其实,他们却根本不相同,因为名称空间决定了它们的本质。

我不知道你为什么会有这样的需求,但在现实中,你这个需求是否可以解释为:

1、你并没要求两个类的类型是相同的

2、你只是希望这个类的代码不需要重写就能在另外一个名称空间下直接使用。

3、两个使用场景是在不同的DLL里(最好是这样)

如果是这样,你可以:

1、在A里:

#if UseBNamespace
namespace B
#endif

#if UseCNamespace
namespace C
#endif
{
pulbic class A
{

}
}

2、然后,你在两个模块里添加这个文件,添加时使用引用(窗口里有选择,看添加按钮的下拉箭头)

3、在不同的模块定义不同的宏

收获园豆:15
519740105 | 大侠五级 |园豆:5810 | 2014-09-27 11:47

我的需求是这样的:我有个 A.dll 里面封装了很多类和函数,直接用他太复杂。所以我根据自己的业务将他封装到 B.dll 里面。对于我的程序 A.dll 是不可见的,可是有些函数返回的类型是 A.dll 里面的,这导致我必须调用 A.dll 。

 

Ten_cnblogs | 园豆:21 (初学一级) | 2014-09-27 14:42

@Ten_cnblogs: 意思你只需要A.dll里的一个类型是吗?试试var。

//fileMain

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using B;

namespace ConsoleApplication1
{
    class Test
    {
        static void Main(string[] args)
        {
            UserB b = new UserB();
            var x= b.GetUnitA();
            Console.WriteLine(x.GetType().Name.ToString() + " "+ x.i + " " + x.j);
           
            Console.Read();
        }
    }
}

//fileB

using A;

namespace B
{
    public class UserB
    {
        public UnitA GetUnitA()
        {
            UnitA a = new A.UnitA();
            a.i = 3;
            a.j = 5;
            return a;
        }
    }

}

//fileA
namespace A
{
    public class UnitA
    {
        public int i;
        public int j;
    }
}

北落师门α | 园豆:17 (初学一级) | 2014-09-27 16:01

@枕上轻寒: var 满足不了,我必须让使用我 dll 的人知道返回类型。

Ten_cnblogs | 园豆:21 (初学一级) | 2014-09-27 16:08

@Ten_cnblogs: 你这个是不可能实现的。

但是你可以:

1、在B.DLL里定义接口或抽象类

2、在A.DLL里实现这些接口或抽象类

3、通过某种特殊的策略(可以通过使用IServiceContainer+IServiceProvider)使得它们之间关联

4、在你的应用(如C.DLL)里,直接使用B.DLL就OK了。

限于你的这个技术需求,给你一个技术:IoC,叫依赖注入,也叫控制反转,就是满足你这样需求的。

519740105 | 园豆:5810 (大侠五级) | 2014-09-27 18:18
其他回答(5)
0

using NamespaceB

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-09-27 10:36
0

不引用命名空间是不可能的。

1.修改相同的命名空间。

2.在C命名空间下新建A。

xiaocong_soft | 园豆:556 (小虾三级) | 2014-09-27 10:45
0

第一、直接引用A其实本身并没有什么问题;

第二、在B中对返回类型,进行包装。

幻天芒 | 园豆:37207 (高人七级) | 2014-09-27 15:25

重新包装的话,怎样重新包装好?因为那个类我看不到源代码,不知道里面隐藏了什么。

我是这样包装的

class A {

  public int AA;

}

 

Class B {

  private A a;

  public AA {

    get{ return a.AA; }  

    set{ a.AA = value; }

  }

  public B(){

    a = new A();

  }

}

支持(0) 反对(0) Ten_cnblogs | 园豆:21 (初学一级) | 2014-09-27 16:12

@Ten_cnblogs: 我觉得你这样包装没啥意义,其实只需要自己包装几个方法就行了,其他的东西,就用它自己本身的吧。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2014-09-27 16:53
0

乾坤大挪移

骑着蜗牛耍流氓 | 园豆:135 (初学一级) | 2014-09-28 10:00
0

在程序开始部分使用using调用一下就行了啊

最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-28 16:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册