我有一个C#generic:
public class Generic<TParameter> { ... }
似乎我不能将未绑定的类型用作类型参数。当我尝试以下操作时,我得到error CS1031: Type expected
:
var lGenericInstance = new Generic<List<>>();
如何将未绑定类型用作泛型类型参数?有变通方法吗?我的泛型类只是使用反射,所以我可以将提供的类型成员的列表作为字符串。
更新:我的答案是关于未绑定类型的问题,因此我跟进了separate question来解决我的具体问题。
答案 0 :(得分:7)
试试这个:
class Foo<T> { }
class Bar<T> { }
Type unboundBar = typeof(Bar<>);
Type unboundFoo = typeof(Foo<>);
Type boundFoo = unboundFoo.MakeGenericType(new[] { unboundBar });
Console.WriteLine(boundFoo.Name);
Conosle.WriteLine(boundFoo.GetGenericArguments().First().Name);
请注意,你不能写
Type boundFoo = typeof(Foo<Bar<>>)
因为规范明确指出:
未绑定的泛型类型只能在 typeof-expression (第7.6.11节)中使用。
(此处Bar<>
未被用作 typeof-expression 的参数,而是 typeof-expression的参数的泛型类型参数。)
然而,它在CLR中是完全合法的,正如上面使用反射所示。
但是你想做什么?你不能拥有未绑定类型的实例,所以我不明白。
答案 1 :(得分:2)
你提出的问题在我看来是错误的。
您的代码中出现的错误是因为您无法在任何地方找到List<>
,因为它需要提供类型。
这一个:var lGenericInstance = new Generic<List<>>();
在List
上失败,而不是在Generic
上......两者都很好,因为它们被链接......:)
所以你的问题更像是:
为什么我不能创建List<>
类型的对象?或者为什么我不能将List<>
指定为我的泛型类的T?