2011-07-29 65 views
4

我想知道是否有建立一個類可以接受多個通用參數 未在編譯時如何通過多個通用參數

class Something<T,V,U> 

這個例子中已知的方式顯示了所期望的一類在運行時接收3個通用參數。 我正在尋找一種方式來指定一個類,它會除外變化量的多個參數沿

class Something<T[]> 

一些東西,我以後可以暴露使用反射

Type [] types = GetType().GetGenericArguments(); 
+1

變量泛型參數?我不這麼認爲。 – BoltClock

+3

使用泛型的主要目的是在編譯時確保類型安全。如果在運行時間之前不知道所涉及的泛型參數,那麼您並不想正確使用泛型。 –

+0

我從來沒有使用它們,就像我建議我只是建立一種分層索引組件,它的圖層持有一個不同類型的鍵的排序字典,我認爲如果像 這樣的變化量有一個參數存在,它會節省我是一個混亂的解決方法的困難。 感謝您忽視該觀念。 –

回答

2

你可以做一些類 - 一種

public static class TypeHelper 
{ 
    public static IEnumerable<Type> GetTypeCombination(this Type type) 
    { 
     if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(T<,>)) 
      return type.GetGenericArguments().SelectMany(GetTypeCombination); 

     return new Type[] { type }; 
    } 
} 

public class T<T1, T2> 
{ 
    public static IEnumerable<Type> GetTypeCombination() 
    { 
     return typeof(T1).GetTypeCombination() 
      .Concat(typeof(T2).GetTypeCombination()); 
    } 
} 

,並使用它作爲

var list = T<int, T<string, int[]>>.GetTypeCombination().ToList(); 

得到(通過)的類型的動態列表 - 不知道這是最好的方式

+0

似乎真的很複雜..我不太明白你做了什麼...... –

+0

你不能傳遞泛型參數的變量數,但你可以傳遞一個類型,它將幾個(一對)它們(每個這對的元素也可以是2) – DanNsk

+0

的組合子,謝謝我需要嘗試一下。 它現在看起來超過了我的聯盟。 –

6

您無法指定未知數量的泛型。你能得到的最接近的是定義所有可能的變體,或者至少與你願意處理的變體一樣多。

public class Something { } 
public class Something<T1> : Something { } 
public class Something<T1, T2> : Something { } 
public class Something<T1, T2, T3> : Something { } 
public class Something<T1, T2, T3, T4> : Something { } 
public class Something<T1, T2, T3, T4, T5> : Something { } 
... 

基類將爲您提供通用的引用以及集中儘可能多的代碼的地方。

根據你的惡意,你最終可能會寫很多冗餘代碼,在這種情況下,你應該重新考慮你對泛型的使用。

+0

感謝我的工作我想到了一個變通 我得到使用反射 我的T和然後裏面的東西我利用內幕的東西,並且反射創建另一個東西可以做多次下降 虐待後我的答案後,如果我做了一些事情。 –