C#公共类别别名?

时间:2010-01-18 20:03:12

标签: c# .net

我想要做的是在一个新的命名空间中用C#编写一些类,它们充当另一个命名空间中的类的包装类。有时候不需要包装类,但我仍然想在新的命名空间中使用相应的类。我想要一个完整的课程副本。有没有办法通过引用另一个类的定义在新命名空间中定义类?换句话说,我想要一个别名。

为了澄清我的意思,如果现有命名空间名为“Namespace1”且新命名空间名为“Namespace2”,则在Namespace2中使用如下代码:

using Class1 = Namespace1.Class1;

不起作用,因为Namespace2.Class1不存在。 Class1只对Namespace2有“私有”别名,而对Namespace2只有“public”。如果我可以在命名空间之外使用Namepsace2.Class1,如果仍然会引用Namespace1.Class1,那么这就是我想要的。

我认为可能有一种方法可以通过属性或反射实现这一点。如果有一些预处理器指令或宏可以复制可以工作的代码,但显然C#没有这样的东西。

7 个答案:

答案 0 :(得分:4)

您可以使用“使用create an alias to a type

using Project = PC.MyCompany.Project;

答案 1 :(得分:2)

如果在不同的命名空间中定义类,则它将是另一个类。 MyNewNamespace.MyClassMyOldNamespace.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