在 Net7.0环境下通过反射创建对象和调用方法

2025-12-13 0 1,031

一、介绍
    最近没事干,就用闲暇时间写点东西,也记录一下温习历程。老人说的好,好记性,不如烂笔头。时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用去网上乱找了。
    今天我要写一些有关反射创建类型实例和调用方法的文章,泛型的类型的创建和泛型方法的调用是普通类型(非泛型类型)的创建和调用还是有区别的,如果不知道,肯定会憋出一身臭汗,其实知道了,也没什么。怕时间长了,忘记。就把关键的代码写出来,为自己提个醒。
    测试环境说明:
          操作系统:Windows10 Professinal
          开发工具:Visual Studio 2022
          测试平台:Windows Console Application
          框架平台:Net 7.0
          
二、我的代码
    我的测试很简单,包含的很全,静态方法、实例方法、私有方法、重载构造函数和方法调用都有涉及,我更关注泛型,分为两种,一种是泛型类型的创建和实例化,第二种是泛型方法的调用。当然了,泛型方法的调用,也区分为:泛型类型的泛型方法的调用和非泛型类型的泛型方法的调用,废话不多说,直接上代码。
    当然有泛型的创建使用,还有其他类型的访问,把所有情况都包好了。
    辅助类型:    

/// <summary>
/// 非泛型类型的泛型方法反射调用。
/// </summary>
internal class InstanceGenericMethod
{
/// <summary>
/// 泛型方法不是生成占位符。
/// </summary>
/// <typeparam name=\”T\”></typeparam>
/// <typeparam name=\”S\”></typeparam>
/// <param name=\”parameter\”></param>
/// <param name=\”s\”></param>
/// <returns></returns>
public T Generate<T, S>(T parameter, S s)
{
Console.WriteLine(\”非泛型类-泛型方法:Generate<T, S>(T parameter, S s) 执行\”);
return parameter;
}
}

/// <summary>
/// 泛型类型的泛型方法反射调用。
/// </summary>
/// <typeparam name=\”X\”></typeparam>
internal class GenericClassMethod<X>
{
/// <summary>
///
/// </summary>
/// <typeparam name=\”T\”></typeparam>
/// <typeparam name=\”S\”></typeparam>
/// <param name=\”parameter\”></param>
/// <param name=\”s\”></param>
/// <returns></returns>
public X Generate<T, S>(X x, T t, S s)
{
Console.WriteLine(\”泛型类-泛型方法:Generate<T, S>(T parameter, S s) 执行\”);
return x;
}
}

    实例方法调用类型:

/// <summary>
/// 针对实例类型方法反射的调用,包含重载方法的反射调用。
/// </summary>
internal class InstanceMethod
{
/// <summary>
/// 无参唯一实例方法。
/// </summary>
public void Process()
{
Console.WriteLine(\”Process()无参实例方法执行。\”);
}

/// <summary>
/// 多参实例方法。
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”dateTime\”></param>
public void DoSomething(int age,string name,DateTime dateTime)
{
Console.WriteLine(\”DoSomething(int age,string name,DateTime dateTime)多参实例方法执行。\”);
}

/// <summary>
/// 重载方法
/// </summary>
public void Generate()
{
Console.WriteLine($\”Generate()\”);
}

/// <summary>
/// 重载方法
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
public void Generate(int age,string name)
{
Console.WriteLine($\”Generate(int age,string name)\”);
}

/// <summary>
/// 重载方法
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”stream\”></param>
public void Generate(int age, string name, Stream stream)
{
Console.WriteLine($\”Generate(int age, string name, Stream stream)已执行\”);
}

/// <summary>
/// 有返回值的重载方法
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”stream\”></param>
public decimal Generate(int age, string name, Stream stream,decimal money)
{
Console.WriteLine($\” Generate(int age, string name, Stream stream,decimal money) 已执行\”);
return money;
}
}

    使用静态和实例方法反射调用的类型:

/// <summary>
/// 通过反射调用私有方法。
/// </summary>
internal class PrivateMethodDemo
{
/// <summary>
/// 有参数的实例私有方法。
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
private void PrivateInstanceMethodTest(int age, string name)
{
Console.WriteLine($\”实例方法:年龄:{age};姓名:{name}\”);
}

/// <summary>
/// 有参数的静态私有方法。
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
private static void PrivateStaticMethodTest(int age, string name)
{
Console.WriteLine($\”静态方法:年龄:{age};姓名:{name}\”);
}
}

    静态方法反射调用的类型:

/// <summary>
/// 静态方法反射调用,包含重载静态方法
/// </summary>
internal class StaticMethod
{
/// <summary>
///
/// </summary>
public static void Process()
{
Console.WriteLine(\”Process()无参实例方法执行。\”);
}

/// <summary>
///
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”dateTime\”></param>
public static void DoSomething(int age, string name, DateTime dateTime)
{
Console.WriteLine(\”DoSomething(int age,string name,DateTime dateTime)多参实例方法执行。\”);
}

/// <summary>
/// 重载方法
/// </summary>
public static void Generate()
{
Console.WriteLine(\”重载方法:Generate() 方法执行。\”);
}

/// <summary>
/// 重载方法
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
public static void Generate(int age, string name)
{
Console.WriteLine(\”重载方法:Generate(int age, string name) 方法执行。\”);
}

/// <summary>
/// 重载方法
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”stream\”></param>
public static void Generate(int age, string name, Stream stream)
{
Console.WriteLine(\”重载方法:Generate(int age, string name, Stream stream) 方法执行。\”);
}

/// <summary>
/// 有返回值的重载方法
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”stream\”></param>
public static decimal Generate(int age, string name, Stream stream, decimal money)
{
Console.WriteLine(\”重载方法:Generate(int age, string name, Stream stream, decimal money) 方法执行。\”);
return money;
}
}

    反射调用重载构造函数的类型:

/// <summary>
/// 反射调用重载构造函数
/// </summary>
internal class MultiCtorDemo
{
private readonly string? name;
private readonly DateTime dateTime;
private readonly int age;

/// <summary>
/// 无参构造函数
/// </summary>
public MultiCtorDemo()
{

}

/// <summary>
/// 重载构造函数
/// </summary>
/// <param name=\”name\”></param>
public MultiCtorDemo(string name)
{
this.name = name;
}

/// <summary>
/// 重载构造函数
/// </summary>
/// <param name=\”age\”></param>
public MultiCtorDemo(int age)
{
this.age = age;
}

/// <summary>
/// 重载构造函数
/// </summary>
/// <param name=\”age\”></param>
/// <param name=\”name\”></param>
/// <param name=\”dateTime\”></param>
public MultiCtorDemo(int age,string name,DateTime dateTime)
{
this.age = age;
this.name = name;
this.dateTime = dateTime;
}
}
    私有和受保护的构造函数反射调用的类型:

/// <summary>
/// 私有和受保护的构造函数反射调用
/// </summary>
internal class PrivateCtorDemo
{
private readonly int age;

/// <summary>
/// 私有构造函数
/// </summary>
private PrivateCtorDemo() { }

/// <summary>
/// 受保护的构造函数
/// </summary>
/// <param name=\”age\”></param>
protected PrivateCtorDemo(int age)
{
this.age = age;
}
}
    测试代码:    

//202309181126、多构造函数反射调用
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.MultiCtorDemo\”);
if (myType != null)
{
var instance = Activator.CreateInstance(myType);
var instance2 = Activator.CreateInstance(myType, new object[] { \”魏延\” });
var instance3 = Activator.CreateInstance(myType, new object[] { 123 });
var instance4 = Activator.CreateInstance(myType, new object[] { 123, \”黄飞虎\”, DateTime.Now });
}
}

//202309181135、私有构造函数反射调用(只有无参构造函数)
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.PrivateCtorDemo\”);
if (myType != null)
{
var obj = Activator.CreateInstance(myType, true);
}
}

//202309181151、泛型类型的反射实例
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.ReflectionGenericDemo`4\”);
if (myType != null)
{
var genericType = myType.MakeGenericType(new Type[] { typeof(int), typeof(string), typeof(float), typeof(decimal), });
var obj = Activator.CreateInstance(genericType);
}
}

//202309181309、实例方法反射调用
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.InstanceMethod\”);
if (myType != null)
{
var myInstance = Activator.CreateInstance(myType);
if (myInstance != null)
{
var method = myType.GetMethod(\”Process\”);
method!.Invoke(myInstance, null);

var method2 = myType.GetMethod(\”DoSomething\”, new Type[] { typeof(int), typeof(string), typeof(DateTime) });
method2!.Invoke(myInstance, new object[] { 112233, \”魏延\”, DateTime.Now });
}
}
}

//202309181330、实例重载方法反射调用
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.InstanceMethod\”);
if (myType != null)
{
var myInstance = Activator.CreateInstance(myType);
if (myInstance != null)
{
var method = myType.GetMethod(\”Generate\”, new Type[] { });
method!.Invoke(myInstance, null);

var method2 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string) });
method2!.Invoke(myInstance, new object[] { 112233, \”魏延\” });

var method3 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string), typeof(Stream) });
method3!.Invoke(myInstance, new object[] { 112233, \”魏延\”, null });

var method4 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string), typeof(Stream), typeof(decimal) });
var value = method4!.Invoke(myInstance, new object[] { 112233, \”魏延\”, null, 4933m });
Console.WriteLine(value);
}
}
}

//202309181345、静态方法、重载方法反射调用(实例对象为空)
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.StaticMethod\”);
if (myType != null)
{
var staticProcess = myType.GetMethod(\”Process\”);
staticProcess!.Invoke(null, null);

var staticDoSomething = myType.GetMethod(\”DoSomething\”, new Type[] { typeof(int), typeof(string), typeof(DateTime) });
staticDoSomething!.Invoke(null, new object[] { 123, \”dddd\”, DateTime.Now });

var staticGenerate = myType.GetMethod(\”Generate\”, new Type[] { });
staticGenerate!.Invoke(null, null);

var staticGenerate2 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string) });
staticGenerate2!.Invoke(null, new object[] { 123, \”123\” });

var staticGenerate3 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string), typeof(Stream) });
staticGenerate3!.Invoke(null, new object[] { 123, \”123\”, null });

var staticGenerate4 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string), typeof(Stream), typeof(decimal) });
var value = staticGenerate4!.Invoke(null, new object[] { 123, \”123\”, null, 2345m });
Console.WriteLine(value);
}
}

//202309181345、静态方法、重载方法反射调用(实例对象不为空)
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var myType = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.StaticMethod\”);
if (myType != null)
{
var instance = Activator.CreateInstance(myType);
var staticProcess = myType.GetMethod(\”Process\”);
staticProcess!.Invoke(instance, null);

var staticDoSomething = myType.GetMethod(\”DoSomething\”, new Type[] { typeof(int), typeof(string), typeof(DateTime) });
staticDoSomething!.Invoke(instance, new object[] { 123, \”dddd\”, DateTime.Now });

var staticGenerate = myType.GetMethod(\”Generate\”, new Type[] { });
staticGenerate!.Invoke(instance, null);

var staticGenerate2 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string) });
staticGenerate2!.Invoke(instance, new object[] { 123, \”123\” });

var staticGenerate3 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string), typeof(Stream) });
staticGenerate3!.Invoke(instance, new object[] { 123, \”123\”, null });

var staticGenerate4 = myType.GetMethod(\”Generate\”, new Type[] { typeof(int), typeof(string), typeof(Stream), typeof(decimal) });
var value = staticGenerate4!.Invoke(instance, new object[] { 123, \”123\”, null, 2345m });
Console.WriteLine(value);
}
}

//202309181349、泛型方法反射调用
{
//非泛型类型的泛型方法反射调用。
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var type = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.InstanceGenericMethod\”);
if (type != null)
{
var instance = Activator.CreateInstance(type);
if (instance != null)
{
var method = type.GetMethod(\”Generate\”);
var genericMethod = method!.MakeGenericMethod(typeof(int), typeof(string));
var value = genericMethod.Invoke(instance, new object[] { 123, \”魏延\” });
Console.WriteLine(value);
}
}
}

//泛型类型的泛型方法反射调用。
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var type = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.GenericClassMethod`1\”);
if (type != null)
{
var genericType = type.MakeGenericType(new Type[] { typeof(int) });
var instance = Activator.CreateInstance(genericType);
if (instance != null)
{
var method = genericType.GetMethod(\”Generate\”);
var genericMethod = method!.MakeGenericMethod(typeof(int), typeof(string));
var value = genericMethod.Invoke(instance, new object[] { 123, 456, \”魏延\” });
Console.WriteLine(value);
}
}
}
}

//202309191105、反射调用静态和实例私有方法
{
Assembly assembly = Assembly.Load(\”PatrickLiu.DelegateDeep.AllStudy\”);
var type = assembly.GetType(\”PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.PrivateMethodDemo\”);
if (type != null)
{
var instance = Activator.CreateInstance(type);
if (instance != null)
{
var privateInstanceMethod = type.GetMethod(\”PrivateInstanceMethodTest\”, BindingFlags.NonPublic|BindingFlags.Instance);
privateInstanceMethod?.Invoke(instance,new object[] {123,\”魏文长\” });

var privateStaticMethod = type.GetMethod(\”PrivateStaticMethodTest\”, BindingFlags.NonPublic | BindingFlags.Static);
privateStaticMethod?.Invoke(instance, new object[] { 123, \”魏文长\” });
}
}
}

三、总结
    好了,写了不少了,其实这里不只是包含泛型类型,也包含其他的,私有方法的调用,静态方法的调用,重载方法和构造函数的调用,基本上都涉及到了,行了,以后有新的东西再写吧。每天努力一点点,老天不负有心人。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 在 Net7.0环境下通过反射创建对象和调用方法 https://www.zuozi.net/36451.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务