GWB*_*GWB 3 c# asp.net generics reflection
我正在构建一个通用的ASP.NET服务器控件,它具有用于指定类型名称的属性.我正在使用控件生成器通过传递属性值来生成我的控件的通用版本Type.GetType(string)
.这非常有效.但是,如果我要指定的类型是通用的,我必须使用如下语法:
<gwb:GenericControl runat="server"
TypeName="System.Collections.Generic.List`1[System.String]" />
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样输入:
<gwb:GenericControl runat="server"
TypeName="System.Collections.Generic.List<System.String>" />
Run Code Online (Sandbox Code Playgroud)
我知道我可以手动解析尖括号的值并将它们转换为方括号,并添加相应的反引号数字前缀,但我想知道是否有任何内置方法来执行此转换?我假设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>" %>
Run Code Online (Sandbox Code Playgroud)
不,没有内置的方法来做到这一点.原因是类型名称Generic<T>
确实特定于C#.实际上,它们在元数据中的写法不同.
简短的版本是它将是类型名称,后跟一个`,然后是一个与通用参数计数相对应的数字. Generic<T>
例如,将被写为Generic`1,Generic<T1,T2>
并将被写为Generic`2.数组为语法添加了一些复杂性,但这是一般规则.
当您使用Type.GetType时,您实际上在进行MetaData查询而不是C#查询.因此必须提供类型名称,因为它出现在MetaData中.