c# - Type.GetType(string) 使用 "Generic<T>"语法?

标签 c# asp.net generics reflection

我正在构建一个通用的 ASP.NET 服务器控件,它具有用于指定类型名称的属性。我正在使用控件生成器通过将属性值传递给 Type.GetType(string) 来生成我的控件的通用版本.这很好用。但是,如果我要指定的类型是通用的,我必须使用如下语法:

<gwb:GenericControl runat="server" 
    TypeName="System.Collections.Generic.List`1[System.String]" />

我希望能够像这样输入:

<gwb:GenericControl runat="server"
    TypeName="System.Collections.Generic.List<System.String>" />

我知道我可以手动解析尖括号的值并将它们转换为方括号,并添加适当的反引号数字前缀,但我想知道是否有任何内置方法可以进行此转换? 我假设 Generic<T>语法特定于 C#(或至少在 VB.NET 中不同)所以我猜我还必须解析任何其他特定于语言的语法。

我注意到 ASP.NET MVC 在 Inherits 中执行此操作Page 的属性指令,但我不确定如何。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<MyModel>" %>

最佳答案

不,没有内置的方法可以做到这一点。原因是类型名称像 Generic<T>确实特定于 C#。它们实际上在元数据中的写法不同。

简短的版本是类型名称,后跟一个`,然后是一个与泛型参数的数量相对应的数字。 Generic<T>例如将写成 Generic`1 和 Generic<T1,T2>将被写成 Generic`2。数组给语法增加了一些复杂性,但这是一般规则。

当您使用 Type.GetType 时,您实际上是在执行元数据查询而不是 C# 查询。因此必须提供类型名称,因为它出现在元数据中。

关于c# - Type.GetType(string) 使用 "Generic<T>"语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/902968/

相关文章:

asp.net - 更改所选 ListView 行的 css

Java:在运行时获取通用类参数

c# - 尝试使用代码将一行插入数据库,然后在单击按钮后显示该行(使用 CommandText)

asp.net - 我如何确定这个 javascript 来自哪里?

c# - 我可以在 XAML 中处理抛出的异常吗?

c# - 开源 ASP.NET 甘特图 Web 控件

java - 使用 XMLAdapter 通过 jaxb 序列化通用字段

java - 另一个 Java 泛型 "incompatible types"编译错误

c# - While循环和变量初始化

c# - 在属性网格中编辑集合的正确方法是什么