2016-02-15 77 views
1

假設我有可能被簡化爲C#的typedef /別名樣結構上的靜態類型

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

要使用富一些相對複雜的通用對象,必須重複使用的類名與通用。

A<MyLongTypeNameIsNotFunToType>.foo(x); 

這將是非常好的,如果有可能簡化這個:

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

我能想到的唯一的事情就是創建一個包裝類

class B : A<MyLongTypeNameIsNotFunToType> { } 

,讓我通過B訪問A的靜態成員。一個問題是,這需要一個公共構造函數,在我的情況下,這是不可能的。很明顯,我可以將A的靜態成員包裝在B中,但看起來非常冗餘。

[我試過使用,但請注意,我需要訪問靜態成員,所以我需要靜態類型。使用似乎不適用於靜態類型。 錯誤:___是在給定的上下文中無效的類型]

任何優雅的解決方案?

+1

在C#【別名關鍵字(如的typedef)的可能的複製? ](http://stackoverflow.com/questions/844651/alias-keyword-like-typedef-in-c) – Jannik

+0

@Jannik號似乎人們沒有關注問題的* static *部分。 – AbstractDissonance

+0

「,但請注意,我需要訪問靜態成員,所以我需要靜態類型」 - >你仍然可以使用「使用」。我想知道這在哪裏不起作用?這似乎是一個騙局,所以我很快刪除了我的答案。 – Tyress

回答

-1

使用using來別名您的類型或命名空間。

using identifier = namespace-or-type-name; 

所以你可以這樣做。

using LongType = A<MyLongTypeNameIsNotFunToType>; 

你可以閱讀更多有關使用方法以及here

更新:

這將是非常好的,如果有可能簡化這個:

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

是的,你可以用下面的代碼實現這一點。

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

檢查Demo

0

爲了讓您的命名空間被指定

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); 
     } 
    } 
} 
0

我有兩個解決方案:

  1. 在所有其他人提及的類文件使用using ..

類定義:

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

用法:

using Alias = A<MyLongTypeNameIsNotFunToType>; 

public class Dummy 
{ 
    public Dummy(MyLongTypeNameIsNotFunToType x) 
    { 
     Alias.foo(x); 
    } 
} 
  • 以不同的方式定義類A,例如T被隱式解析意義類型的參數x將自動解析類型T(在編譯時)。
  • 我之所以用這個選項會會你有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.