反射创建各种类型对象

反射构造各种类型实例

一般类型对象

对于一般类型,直接使用Activity.CreateInstance(Type)进行创建。

public class Data{}

public class Program
{
    static void Main()
    {
        Type type = typeof(Data);
        
        object obj = Activitor.CreateInstance(type);
    }
}

创建数组对象

  1. 使用Activitor.CreateInstance创建
public class Data{}

public class Program
{
    
    static void Main()
    {
        //数组元素类型
        Type elementType = typeof(Data);
        
        //根据数组元素类型,生成数据类型,MakeArrayType可以传递int参数,表示数组的维数
        //默认不传递的话,表示一维数组
        Type arrayType = elementType.MakeArrayType();
        
        //利用Activitor.CreateInstance创建数组对象实例
        //注意,必须向构造器传递数组的长度,这里为10
        object arrObj = Activator.CreateInstance(arrayType,10);
        
        Console.WriteLine(((Data[])arrObj).Length);
    }
}
  1. 使用Array.CreateInstance进行创建
public class Data{}

public class Program
{
    static void Main()
    {
        //数组元素类型
        Type elementType = typeof(Data);
        
        //第一个参数为数据元素的类型,第二个为数组长度
        //Array.CreateInstance还提供了其他几个重写方法,可以支持多为数组的创建
        Array arrObj = Array.CreateInstancee(elementType,10);
    }
}

委托类型创建

委托类型创建,可以通过Delegate.CreateDelegate(Type,object,MethodInfo);

public delete void CustomDele();

public class Program
{
    static void Main()
    {
        //创建静态函数的委托
        CreateStaticDelete();
        
        //创建成员函数的委托
        CreateInstanceDelete();
    }
    
    
    static void CreateStaticDelete()
    {
        //要生成委托的类型
        Type delType = typeof(CustomDele);
        
        //要绑定的方法
        MethodInfo mInfo = typeof(Program).GetMethod("SayHello",BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static);
        
        //利用Delegate.CreateDelegate()创建委托
        //第一个参数为委托类型
        //第二个参数为方法实体对象,如果是成员函数,需要制定,静态则不需要指定
        //第三个参数为绑定方法的MethodInfo
        Delegate deleObj = Delegate.CreateDelegate(delType,null,mInfo);
        
        //调用委托,如果委托具备参数,可以向DynamicInvoke传递参数
        deleObj.DynamicInvoke();
    }
    
    
    static void CreateInstanceDelete()
    {
        //获取委托类型
        Type delType =typeof(CustomDele);
        
        //创建实例对象
        Cat cat = new Cat();
        
        //获取方法
        MethodInfo mInfo = typeof(Cat).GetMethod("Sleep");
        
        //因为委托要绑定的是成员函数,所以要传递类实例
        Delegate deleObj = Delegate.CreateDelegate(delType,cat,mInfo);
        
        //调用委托
        CustomDele act = (CustomDele)deleObj;
        act();
    }
    static void SayHello(){}
}

public class Cat
{
    public void Sleep(){}
}

创建泛型对象

在创建泛型对象之前,首先要了解一下泛型相关的知识,泛型可以分为开发类型和封闭类型。
开放类型是指未指定了泛型的类型参数的泛型,如Dictionary<TKey,TValue>就是开放类型,开放类型是不能构造实例的,很好理解,因为不知道创建的TKey,TValue是什么类型。
封闭类型是指指定了泛型类型参数的,如Dictionary<string,int>这里的string类型和int类型称之为类型实参。

下面看一下如何具体创建一个泛型实例对象

public class Program
{
    static void Main()
    {
        //首先获取泛型的开放类型
        Type openType = typeof(Dictionary<,>);
        
        //然后获取封闭类型
        Type closeType = openType.MakeGenericType(typeof(string),typeof(int));
        
        //然后根据封闭类型创建类型实例
        object obj = Activitor.CreateInstance(closeType);
        
        Console.WriteLine(obj.GetType());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值