这个是不可能的。
一个对象是不可能有两个不同的命名空间的,所以你的方案不可行。
至于在不同的,名称空间定义完全相同的类,看起来是完全相同的,其实,他们却根本不相同,因为名称空间决定了它们的本质。
我不知道你为什么会有这样的需求,但在现实中,你这个需求是否可以解释为:
1、你并没要求两个类的类型是相同的
2、你只是希望这个类的代码不需要重写就能在另外一个名称空间下直接使用。
3、两个使用场景是在不同的DLL里(最好是这样)
如果是这样,你可以:
1、在A里:
#if UseBNamespace namespace B #endif #if UseCNamespace namespace C #endif { pulbic class A { } }
2、然后,你在两个模块里添加这个文件,添加时使用引用(窗口里有选择,看添加按钮的下拉箭头)
3、在不同的模块定义不同的宏
我的需求是这样的:我有个 A.dll 里面封装了很多类和函数,直接用他太复杂。所以我根据自己的业务将他封装到 B.dll 里面。对于我的程序 A.dll 是不可见的,可是有些函数返回的类型是 A.dll 里面的,这导致我必须调用 A.dll 。
@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;
}
}
@枕上轻寒: var 满足不了,我必须让使用我 dll 的人知道返回类型。
@Ten_cnblogs: 你这个是不可能实现的。
但是你可以:
1、在B.DLL里定义接口或抽象类
2、在A.DLL里实现这些接口或抽象类
3、通过某种特殊的策略(可以通过使用IServiceContainer+IServiceProvider)使得它们之间关联
4、在你的应用(如C.DLL)里,直接使用B.DLL就OK了。
限于你的这个技术需求,给你一个技术:IoC,叫依赖注入,也叫控制反转,就是满足你这样需求的。
using NamespaceB
不引用命名空间是不可能的。
1.修改相同的命名空间。
2.在C命名空间下新建A。
第一、直接引用A其实本身并没有什么问题;
第二、在B中对返回类型,进行包装。
重新包装的话,怎样重新包装好?因为那个类我看不到源代码,不知道里面隐藏了什么。
我是这样包装的
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();
}
}
@Ten_cnblogs: 我觉得你这样包装没啥意义,其实只需要自己包装几个方法就行了,其他的东西,就用它自己本身的吧。
乾坤大挪移
在程序开始部分使用using调用一下就行了啊