动态为类追加泛型类型参数
欢迎来访问我的blogs,今天写代码时,用到为方法动态添加泛性类型参数.就和大家一起来分享要实现这样一个功能所需要的相关知识:
Type只是一中声明,能带表众多类型.
Type.FindMembers方法.
返回一个被过滤后的指定成员MemberInfo对象的数组.
public virtual MemberInfo[] FindMembers(
MemberTypes memberType,
BindingFlags bindingAttr,
MemberFilter filter,
Object filterCriteria
)
参数:
memberType:所有搜索成员的类型,
bindingAttr:有多个BindingFlags组成,BindingFlags是一个控制绑定和搜索成员与反射被引导的类型的标记
Type.GetArrayRank()
能得到数组的维数.
Type.GetConstructors()
返回类型:System.Reflection.ConstructorInfo[]
一个ConstructorInfo objects的数组表示当前类型所有public的实例构造器,但不包括这个类型的初始化器.如当前类型中没public实例的构造器,或当前类型表示一个在一个泛型类型或泛型类型方法的定义的一个类型参数.
这里就比较重要,如果当前类型表示泛型类型的构造,这个方法返回ConstrutorInfo对象,类型参数被适当的类型 arguments替换.如,如C<T>已经有一个构造器,C(T ti),调用GetConstructors,返回的ConstrutorInfo对象里就是C(int t1).
If the current Type represents a generic type parameter, the GetConstructors method returns an empty array.
Type.GetCustomAttributes方法
能到达一个派生类,返回这个类和派生类的所有自定义 attributes.
返回一个System.Objcet[],这个数组包括所有的自定义属性.
Type.GetDefaultMembers 方法
搜索当前类型属于DefaultMemberAttribute集合下的成员.
Type.GetFields 方法
得到当前类型的field.
Type.GetGenericArguments方法
返回一个Type对象的数组表示一个泛型类型类型Arguments或定义泛型类型的参数的类型Arguments.
Type.IsGenericParameter属性
得到一个值表示当Type的 类型参数是不是泛型类型或泛型方法.
得到一个值表示是否当前类型是一个泛型类型.
TypeBuilder类
在运行时定义和创建一个类型的实例.
它是一个root 类被使用来控制在运行动态创建类.它提供一系定义类型的事务,添加方法和域,并且在运行时创建类.
TypeBuilder.DefineGenericParameters
为当前类型定义泛型类型参数,指定他他们的个数和名,并且放一个相应的被设置参数后的GenericTypeParameterBuilder对象数组.
System.Reflection.Emit
public GenericTypeParameterBuilder[] DefineGenericParameters(
params string[] names
)
GenericTypeParameterBuilder类
为想动态定义泛型和方法创建和定义泛型类型参数.不能继承.
MethodBuilder
在一个动态类中定义和表示一个方法(后构造器).
MethodBuilder.DefineGenericParameters方法
为当前方法设置泛型类型参数,指定他们的名,和反回一个GenericTypeParameterBuilder类的数组,(注意这个为当前方法).这定义的泛型类型参数,可以通过反射的
GetGenericArguments.
public GenericTypeParameterBuilder[] DefineGenericParameters(
params string[] names
)
这个类就不用介绍拉:
Type.MakeGenericType方法
替换用当前泛性类型定义的类型参数的数组的元素并且返回Type对象.
public virtual Type MakeGenericType(
params Type[] typeArguments
)
Type.MakeArrayType 方法.
返回一个Type对象来表示当前类型的数组.通常都使用是一维的.
具体实现参考MSDN
具体代码不方便放上来,等我改哈再放上来分享哈.如果你是常来我的blogs的兄弟,那你还是看一下,有一点印像.
works guo
Type只是一中声明,能带表众多类型.
Type.FindMembers方法.
返回一个被过滤后的指定成员MemberInfo对象的数组.
public virtual MemberInfo[] FindMembers(
MemberTypes memberType,
BindingFlags bindingAttr,
MemberFilter filter,
Object filterCriteria
)
参数:
memberType:所有搜索成员的类型,
bindingAttr:有多个BindingFlags组成,BindingFlags是一个控制绑定和搜索成员与反射被引导的类型的标记
Type.GetArrayRank()
能得到数组的维数.
Type.GetConstructors()
返回类型:System.Reflection.ConstructorInfo[]
一个ConstructorInfo objects的数组表示当前类型所有public的实例构造器,但不包括这个类型的初始化器.如当前类型中没public实例的构造器,或当前类型表示一个在一个泛型类型或泛型类型方法的定义的一个类型参数.
这里就比较重要,如果当前类型表示泛型类型的构造,这个方法返回ConstrutorInfo对象,类型参数被适当的类型 arguments替换.如,如C<T>已经有一个构造器,C(T ti),调用GetConstructors,返回的ConstrutorInfo对象里就是C(int t1).
If the current Type represents a generic type parameter, the GetConstructors method returns an empty array.
Type.GetCustomAttributes方法
能到达一个派生类,返回这个类和派生类的所有自定义 attributes.
返回一个System.Objcet[],这个数组包括所有的自定义属性.
Type.GetDefaultMembers 方法
搜索当前类型属于DefaultMemberAttribute集合下的成员.
Type.GetFields 方法
得到当前类型的field.
Type.GetGenericArguments方法
返回一个Type对象的数组表示一个泛型类型类型Arguments或定义泛型类型的参数的类型Arguments.
Type.IsGenericParameter属性
得到一个值表示当Type的 类型参数是不是泛型类型或泛型方法.
得到一个值表示是否当前类型是一个泛型类型.
TypeBuilder类
在运行时定义和创建一个类型的实例.
它是一个root 类被使用来控制在运行动态创建类.它提供一系定义类型的事务,添加方法和域,并且在运行时创建类.
TypeBuilder.DefineGenericParameters
为当前类型定义泛型类型参数,指定他他们的个数和名,并且放一个相应的被设置参数后的GenericTypeParameterBuilder对象数组.
System.Reflection.Emit
public GenericTypeParameterBuilder[] DefineGenericParameters(
params string[] names
)
GenericTypeParameterBuilder类
为想动态定义泛型和方法创建和定义泛型类型参数.不能继承.
MethodBuilder
在一个动态类中定义和表示一个方法(后构造器).
MethodBuilder.DefineGenericParameters方法
为当前方法设置泛型类型参数,指定他们的名,和反回一个GenericTypeParameterBuilder类的数组,(注意这个为当前方法).这定义的泛型类型参数,可以通过反射的
GetGenericArguments.
public GenericTypeParameterBuilder[] DefineGenericParameters(
params string[] names
)
这个类就不用介绍拉:
Type.MakeGenericType方法
替换用当前泛性类型定义的类型参数的数组的元素并且返回Type对象.
public virtual Type MakeGenericType(
params Type[] typeArguments
)
Type.MakeArrayType 方法.
返回一个Type对象来表示当前类型的数组.通常都使用是一维的.
具体实现参考MSDN
具体代码不方便放上来,等我改哈再放上来分享哈.如果你是常来我的blogs的兄弟,那你还是看一下,有一点印像.
works guo