T_Cyjb_TypeUtil - CYJB/Cyjb GitHub Wiki

TypeUtil 类

提供 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 的继承链向上查找,直到找到当前泛型类型定义的封闭构造类型。
  Back to Top

字段

 

名称 说明
公共字段静态成员 ConstructorName 类型的构造函数方法名称。
  Back to Top

Remarks

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);
    }
}

参见

Reference

Cyjb 命名空间

Other Resources

《C# 反射的委托创建器》

⚠️ **GitHub.com Fallback** ⚠️