一个程序集可以在同一命名空间内定义多个具有相同名称的类型,只要每个类型的类型参数(泛型参数)数量不同即可。例如:
var strA = typeof(Action).ToString(); // "System.Action"
var strB = typeof(Action<>).ToString(); // "System.Action`1[T]"
var strC = typeof(Action<,>).ToString(); // "System.Action`2[T1,T2]"
var strD = typeof(Action<,,>).ToString(); // "System.Action`3[T1,T2,T3]"
在C#中,只能在
typeof(...)
关键字中使用空的
<...>
,即避免指定类型参数。
另一个例子:
typeof(Dictionary<,>).ToString()
会返回
"System.Collections.Generic.Dictionary`2[TKey,TValue]"
。可以看到,在.NET(CLI)中,泛型参数的数量由一个反引号后跟数字来表示。
使用示例:
static bool IsDictionary(object obj)
{
if (obj == null)
return false;
var t = obj.GetType();
return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>);
}
static object GetDictionary(object a, object b)
{
var t = typeof(Dictionary<,>).MakeGenericType(a.GetType(), b.GetType());
return Activator.CreateInstance(t);
}
但如果可能的话,避免使用反射并使用编译时类型,例如(与上面的代码不完全相同):
static Dictionary<TA, TB> GetDictionary<TA, TB>(TA a, TB b)
{
return new Dictionary<TA, TB>();
}
<>
表示您想引用未指定的类型。这通常与反射一起使用,以便您可以在运行时“填充”TParams
。 - AronISomeType<>
是一个开放式泛型类型,具有一个泛型参数。Dictionary<,>
是一个开放式泛型类型,具有两个泛型参数。关于什么是开放式泛型类型的描述,请参考我链接的问题的回答。 - xanatosList<>
可以是List<string>
或List<int>
。 - Mark E<>
和<,>
的含义。这就像是一方面询问override
的作用,另一方面询问如何在方法中实现多态行为。这两个问题本质上可以同时回答,但它们是从不同角度“攻击”一个主题的两个不同问题。 - O. R. Mapper