我想要做的是在一个新的命名空间中用C#编写一些类,它们充当另一个命名空间中的类的包装类。有时候不需要包装类,但我仍然想在新的命名空间中使用相应的类。我想要一个完整的课程副本。有没有办法通过引用另一个类的定义在新命名空间中定义类?换句话说,我想要一个别名。
为了澄清我的意思,如果现有命名空间名为“Namespace1”且新命名空间名为“Namespace2”,则在Namespace2中使用如下代码:
using Class1 = Namespace1.Class1;
不起作用,因为Namespace2.Class1
不存在。 Class1只对Namespace2有“私有”别名,而对Namespace2只有“public”。如果我可以在命名空间之外使用Namepsace2.Class1
,如果仍然会引用Namespace1.Class1
,那么这就是我想要的。
我认为可能有一种方法可以通过属性或反射实现这一点。如果有一些预处理器指令或宏可以复制可以工作的代码,但显然C#没有这样的东西。
答案 0 :(得分:4)
您可以使用“使用create an alias to a type:
”using Project = PC.MyCompany.Project;
答案 1 :(得分:2)
如果在不同的命名空间中定义类,则它将是另一个类。 MyNewNamespace.MyClass
和MyOldNamespace.MyClass
是.NET中的两种不同类型。
您可以在新类中轻松封装所有第一类的公共API,但这需要一些样板代码。 AOP可以使用PostSharp(使用自定义过滤器)等方式更简单地提供一种方法。
答案 2 :(得分:2)
听起来你需要将一个类定义映射到另一个。
这可以手动完成(通过大量样板代码)或通过AutoMapper等工具自动完成。
答案 3 :(得分:1)
您可以继承该课程:
namespace N2
{
public class Class1 : N1.Class1
{ }
}
答案 4 :(得分:0)
是的,如果我在msdn article on alias namespacing
正确理解你,你可以这样做这是魔术
using colAlias = System.Collections
所以我在我自己的命名空间下对System.Collections进行别名。
这是示例
using colAlias = System.Collections;
namespace System
{
class TestClass
{
static void Main()
{
// Searching the alias:
colAlias::Hashtable test = new colAlias::Hashtable();
// Add items to the table.
test.Add("A", "1");
test.Add("B", "2");
test.Add("C", "3");
foreach (string name in test.Keys)
{
// Seaching the gloabal namespace:
global::System.Console.WriteLine(name + " " + test[name]);
}
}
}
}
答案 5 :(得分:0)
WRT包装器类,我发现很多时候人们只将类包装为扩展功能,而不是使用它来表达is-a关系。 对于这些情况,您可以考虑Extension Methods。
这允许您为现有类编写方法,而不是仅为了添加更多功能而导出。对于前。
/// <summary>
/// ICollectionExtensions
/// </summary>
internal static class ICollectionExtensions
{
public static void AddNew<T>(this ICollection<T> self, T data)
{
if (self != null && !self.Contains(data))
{
self.Add(data);
}
}
}
然后,您可以在.AddNew()
类型上ICollection<T>
。
答案 6 :(得分:0)
不确定您要完成的任务,但也请查看AutoMapper。