2010-01-07 81 views
3

第一個問題在這裏。 我想使用字段的類型實例化一個泛型類。在運行時使用字段類型實例化通用類

public class ValueRange<type1> 
{ 
    type1 min; 
    type1 max; 
} 

void foo() 
{ 
    int k; 
    ValueRange<k.GetType()> range; 
} 

這是行不通的。有什麼建議麼?
在此先感謝

回答

6

這需要編譯時類型,像這樣:

ValueRange<int> range; 

這也是值得注意的是,你通常命名類型的「T」;這只是普遍接受的標準(因此很好閱讀)。

+0

這其實並沒有回答這個問題。看到Benjamins的答案,就是這樣。 – James 2010-01-07 12:28:56

+0

詹姆斯:那麼,由OP來決定什麼回答這個問題:) – 2010-01-07 12:34:33

+0

「在運行時」是什麼給了我 - 但我不知道,如果我正確地解析它:) – 2010-01-07 12:40:56

8

樣本很混亂。我懷疑你想要類似於

Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType()); 
Activator.CreateInstance(genericType); 
+0

+1,雖然它會是'typeof(ValueRange <>) 。 – 2010-01-07 12:27:50

+0

即將發佈類似的東西! – James 2010-01-07 12:29:35

+0

@Mark:修正它,謝謝你。 – 2010-01-07 12:42:36

1

你可以在運行時實例化類型,但是你不能像你在做的那樣聲明變量。

Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType()); 
object instance = Activator.CreateInstance(genericType); 

當涉及到泛型類型的協變和逆變時,.NET 4.0有了新的規則。這應該有助於更強大地鍵入變量。

編輯:爲了便於閱讀,更改了示例代碼以使用幫助變量genericType

1

爲了更清楚。在上面的例子中,ValueRange是我的課程,而不是c#課程。

我想知道是否有任何方法可以避免聲明兩次類型。

int k; 
ValueType m; 

在這個聲明中,類型「int」被聲明瞭兩次。但這在我看來是多餘的。例如,如果我想改變k的類型,我將不得不更改這兩個聲明。我知道「Activator.CreateInstance」,但這對我來說並不好看!太複雜!!但是,如果沒有更好的解決方案,我會堅持下去

相關問題