T_Cyjb_TypeUtil - CYJB/Cyjb GitHub Wiki
提供 Type 类的扩展方法。
提供 Type 类创建委托的扩展方法。
System.Object
Cyjb.TypeUtil
Namespace: Cyjb
Assembly: Cyjb (in Cyjb.dll) Version: 1.0.23+7750dd8e971297c5fa962a3bee37fb78f72793f6
C#
public static class TypeUtil
The TypeUtil type exposes the following members.
名称 | 说明 | |
---|---|---|
![]() ![]() ![]() |
CloseDefinitionFrom | 沿着指定 Type 的继承链向上查找,直到找到当前泛型类型定义的封闭构造类型。 |
![]() ![]() |
GetEncompassedType | 返回 types 中能够被其它所有类型包含的类型(可以隐式转换为其它所有类型)。 |
![]() ![]() |
GetEncompassingType | 返回 types 中能够包含其它所有类型的类型(可以从其它所有类型隐式转换而来)。 |
![]() ![]() |
GetNonNullableType | 返回与当前 Type 对应的非可空类型。 |
![]() ![]() ![]() |
IsConvertFrom | 确定当前 Type 的实例是否可以从 fromType 的实例类型转换得到。 |
![]() ![]() |
IsDelegate | 检查当前 Type 是否表示委托。 |
![]() ![]() ![]() |
IsExplicitFrom | 确定当前 Type 的实例是否可以从 fromType 的实例显式类型转换得到。 |
![]() ![]() ![]() |
IsImplicitFrom | 确定当前 Type 的实例是否可以从 fromType 的实例隐式类型转换得到。 |
![]() ![]() |
IsNullable | 确定当前 Type 是否是可空类型。 |
![]() ![]() |
IsNumeric | 返回当前 Type 是否表示数字类型。 |
![]() ![]() |
IsSigned | 返回当前 Type 是否表示有符号整数类型。 |
![]() ![]() |
IsUnsigned | 返回当前 Type 是否表示无符号整数类型。 |
![]() ![]() |
PowerDelegate(Type, String, Type, BindingFlags) | 创建用于表示指定静态或实例成员的指定类型的委托。 |
![]() ![]() |
PowerDelegate(Type, String, Type, Object, BindingFlags) | 使用指定的第一个参数,创建用于表示指定静态或实例成员的指定类型的委托。 |
![]() ![]() |
PowerDelegate(TDelegate)(Type, String, BindingFlags) | 创建用于表示指定静态或实例成员的指定类型的委托。 |
![]() ![]() |
PowerDelegate(TDelegate)(Type, String, Object, BindingFlags) | 使用指定的第一个参数,创建用于表示指定静态或实例成员的指定类型的委托。 |
![]() ![]() ![]() |
UniqueCloseDefinitionFrom | 沿着指定 Type 的继承链向上查找,直到找到当前泛型类型定义的封闭构造类型。 |
名称 | 说明 | |
---|---|---|
![]() ![]() |
ConstructorName | 类型的构造函数方法名称。 |
TypeUtil 类提供的 PowerDelegate
方法,其的用法与 Delegate.CreateDelegate
类似, 功能却大大丰富,几乎可以只依靠委托类型、反射类型和成员名称构造出任何需要的委托。
关于对反射创建委托的效率问题,以及该类的实现原理,可以参见我的博文 《C# 反射的委托创建器》。
一下是一些简单的示例,很容易构造出需要的委托。
class Program {
public delegate void MyDelegate(params int[] args);
public static void TestMethod(int value) { }
public void TestMethod(uint value) { }
public static void TestMethod{T}(params T[] arg) { }
static void Main(string[] args) {
Type type = typeof(Program);
Action<int> m1 = type.PowerDelegate<Action<int>>("TestMethod");
m1(10);
Program p = new Program();
Action<Program, uint> m2 = type.PowerDelegate<Action<Program, uint>>("TestMethod");
m2(p, 10);
Action<object, uint} m3 = type.PowerDelegate<Action<object, uint>>("TestMethod");
m3(p, 10);
Action<uint} m4 = type.PowerDelegate<Action<uint>>("TestMethod", p);
m4(10);
MyDelegate m5 = type.PowerDelegate<MyDelegate>("TestMethod");
m5(0, 1, 2);
}
}