第一個問題在這裏。 我想使用字段的類型實例化一個泛型類。在運行時使用字段類型實例化通用類
public class ValueRange<type1>
{
type1 min;
type1 max;
}
void foo()
{
int k;
ValueRange<k.GetType()> range;
}
這是行不通的。有什麼建議麼?
在此先感謝
第一個問題在這裏。 我想使用字段的類型實例化一個泛型類。在運行時使用字段類型實例化通用類
public class ValueRange<type1>
{
type1 min;
type1 max;
}
void foo()
{
int k;
ValueRange<k.GetType()> range;
}
這是行不通的。有什麼建議麼?
在此先感謝
這需要編譯時類型,像這樣:
ValueRange<int> range;
這也是值得注意的是,你通常命名類型的「T」;這只是普遍接受的標準(因此很好閱讀)。
樣本很混亂。我懷疑你想要類似於
Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
Activator.CreateInstance(genericType);
+1,雖然它會是'typeof(ValueRange <>) 。 – 2010-01-07 12:27:50
即將發佈類似的東西! – James 2010-01-07 12:29:35
@Mark:修正它,謝謝你。 – 2010-01-07 12:42:36
你可以在運行時實例化類型,但是你不能像你在做的那樣聲明變量。
Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
object instance = Activator.CreateInstance(genericType);
當涉及到泛型類型的協變和逆變時,.NET 4.0有了新的規則。這應該有助於更強大地鍵入變量。
編輯:爲了便於閱讀,更改了示例代碼以使用幫助變量genericType
。
爲了更清楚。在上面的例子中,ValueRange是我的課程,而不是c#課程。
我想知道是否有任何方法可以避免聲明兩次類型。
int k;
ValueType m;
在這個聲明中,類型「int」被聲明瞭兩次。但這在我看來是多餘的。例如,如果我想改變k的類型,我將不得不更改這兩個聲明。我知道「Activator.CreateInstance」,但這對我來說並不好看!太複雜!!但是,如果沒有更好的解決方案,我會堅持下去
這其實並沒有回答這個問題。看到Benjamins的答案,就是這樣。 – James 2010-01-07 12:28:56
詹姆斯:那麼,由OP來決定什麼回答這個問題:) – 2010-01-07 12:34:33
「在運行時」是什麼給了我 - 但我不知道,如果我正確地解析它:) – 2010-01-07 12:40:56