2017-04-26 26 views
3

總之這幾乎解釋了我的問題......我怎樣才能獲得的類型參數的數量上的開放式泛型在C#

class Foo<T> { ... } 
var type = typeof(Foo<>); <-- runtime provides a RuntimeType object instance in my real code 
var paramCount = ((RuntimeType)type).GetGenericParameters().Count; <-- I need this 

當然,問題是,「RuntimeType」是一個內部類型(我相信)mscorlib,所以我無法從我的代碼訪問它。

是否有另一種/更好的方法來做到這一點?

更新:

我發現了一個「醜陋的,可能不安全」的方式來實現基本上是我需要的,但我相信這是一個壞主意(原因很明顯)...

var paramCount = int.Parse(type.Name.Substring(t.Name.Length-1)); 

這是假設很多,只是感到討厭。那說......我已經在反思世界......所以它本質上是討厭的。

當然有更好的方法來做到這一點,雖然?

回答

3

如果您使用的是完整的.NET,那麼你可以簡單地說:

int num = type.GetGenericArguments().Length; 

如果您使用的是.NET的核心則見https://stackoverflow.com/a/39140220/613130

TypeInfo typeInfo = type.GetTypeInfo(); 
int num = typeInfo.IsGenericTypeDefinition 
    ? typeInfo.GenericTypeParameters.Length 
    : typeInfo.GenericTypeArguments.Length; 

如果你總是有一個開放的通用再顯然:

int num = type.GetTypeInfo().GenericTypeParameters.Length; 
+0

@War如果你使用完整的.NET,那麼'type.GetGenericArguments()。Length;'將工作。你不需要投射。 'type'變量應該被聲明爲'Type type'。 'RuntimeType'是內部的東西,你可以忽略。 – xanatos

+0

啊不錯..。感謝人:)只是需要拉System.reflection ...葉我認爲這是一個完整的.Net的東西只...不會工作的核心 – War

相關問題