C#typedef / alias就像静态类型上的构造一样

时间:2016-02-15 05:43:48

标签: c#

假设我有一些相对复杂的通用对象,可以简化为

class A<T>
{
   static void foo(T x) { }
}

要使用foo,必须重复使用带有通用名称的类名。

A<MyLongTypeNameIsNotFunToType>.foo(x);

如果能够简化这一点,那将是非常好的:

alias AA = A<MyLongTypeNameIsNotFunToType>;
AA.foo(x);

我唯一能想到的就是创建一个包装类

class B : A<MyLongTypeNameIsNotFunToType> { }

允许我通过B访问A的静态成员。一个问题是,这需要一个公共构造函数,在我的情况下,这是不可能的。显然我可以将A的静态成员包装在B中,但这似乎非常多余。

[我尝试过使用,但请注意我需要访问静态成员,所以我需要静态类型。使用似乎不适用于静态类型。 错误:___是在给定上下文中无效的类型]

任何优雅的解决方案?

3 个答案:

答案 0 :(得分:0)

要创建Type的别名,请在指定名称空间的位置执行以下操作

using S = MyLongTypeNameIsNotFunToType;

然后使用它,您可以执行以下操作

//A<S>.foo(new S());
A<S>.foo(x);

您还可以继续将A更改为以下

using S = MyLongTypeNameIsNotFunToType;
using AA = A<MyLongTypeNameIsNotFunToType>;

然后在你的代码中你可以去做

AA.foo(x);

或者

A<S>.foo(x);

这是复制并粘贴到控制台应用程序示例

namespace ConsoleApplication3
{
    using B = MyLongTypeNotFunToType;
    using C = A<MyLongTypeNotFunToType>;
    public class A<T>
    {
        public static void foo(T foo)
        {

        }
    }

    public class MyLongTypeNotFunToType
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
          var x = new B();
          A<B>.foo(x);
          C.foo(x);
        }
    }
}

答案 1 :(得分:0)

我有两个解决方案:

  1. 在类文件中使用using,正如其他人提到的那样..
  2. 班级定义:

    class A<T>
    {
        public static void foo(T x) { }
    }
    

    用法:

    using Alias = A<MyLongTypeNameIsNotFunToType>;
    
    public class Dummy
    {
        public Dummy(MyLongTypeNameIsNotFunToType x)
        {
            Alias.foo(x);
        }
    }
    
    1. 以不同的方式定义类A,以便隐式解析类型T,这意味着参数x的类型将自动解析类型T(在编译时)。
    2. 我使用此选项的原因是您拥有static方法,否则您可以使用与A<T>相同的方式实现类List<T>并使用上面给出的解决方案1。

      班级定义:

      class A // <-- removed the <T> from class and added in the method declaration
      {
          public static void foo<T>(T x) { }
      }
      

      用法:

      public class Dummy
      {
          public Dummy(MyLongTypeNameIsNotFunToType x)
          {
              A.foo(x);
          }
      }
      

      我希望你能看到解决方案2的简单性。

答案 2 :(得分:-1)

使用using为您的类型或命名空间设置别名。

using   identifier = namespace-or-type-name;

所以你可以这样做。

using LongType = A<MyLongTypeNameIsNotFunToType>;

您可以详细了解使用情况和详细信息here

更新:

如果能够简化这一点,那将是非常好的:

  

别名AA = A&lt; MyLongTypeNameIsNotFunToType&gt ;;
  AA.foo(X);

是的,您可以使用以下代码实现此目的。

using newname = A<int> ;
newname.foo(10);

检查Demo