2016-12-23 30 views
2

我想用它们声明的参数名称来生成泛型类的名称。例如,如果我有泛型类和实例化的如下所示我想打印"MyClass<P1,M>"在C中访问泛型类型的GenericTypeParameters#

​​

现在,我让我的类型信息myInstance,然后泛型类型定义是这样的:

// MyClass<int,string> type info here 
var type = myInstance.GetType(); 
// MyClass<P1, M1> type info here 
var genericType = type.GetGenericTypeDefinition(); 

调试器显示了所有参数名genericType财产GenericTypeParameters并输入信息。然而,我无法从我的C#代码访问该集合,并将genericType转换为System.RuntimeType类,因为RuntimeType是内部的,所以无法工作。

那么有没有办法访问GenericTypeParameters属性莫名其妙或我在这里SOL? 环境VS2015,.NET 4.6.1

回答

4

我认为你只是在寻找Type.GetGenericArguments,你应该呼吁genericType而非type - 在这一点上,键入“论据”是真正的类型参数因为这是一个开放式的。

样品(使用Dictionary<,>为简单起见):

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     var dictionary = new Dictionary<string, int>(); 
     var type = dictionary.GetType(); 
     var genericType = type.GetGenericTypeDefinition(); 
     foreach (var typeArgument in genericType.GetGenericArguments()) 
     { 
      // TKey, then TValue 
      Console.WriteLine(typeArgument); 
     } 
    } 
} 
与信息,您可以制定出字符串格式化等自己

希望。

+0

@MichaelLiu:啊,是的 - 哎呀,误读。将删除,编辑然后取消删除。 –

+0

太棒了!几乎GetGenericArguments()返回GenericTypeParameters属性,我可以在调试器中看到。现在混乱消失了。 –