C# 反射调用私有 静态 方法

本文介绍了一种通过反射机制调用静态方法的技术实现方法。在C#中,使用System.Reflection命名空间下的Assembly类加载程序集,并获取指定类型的静态方法进行调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//被反射的类 
   public class Class1 
    {
        static void Class111()
        {
            Console.WriteLine("1fffffffffffffffffffffffffffffffff");
        }
    }


调用类

        static void Main(string[] args)
        {
            var assem = System.Reflection.Assembly.LoadFrom(".\\ClassLibrary1.dll");
            //可以通过assem.GetTypes(Class1);直接使用
            var types = assem.GetTypes();
            foreach (var item in types)
            {
                var func = item.GetMethod("Class111", 
                    System.Reflection.BindingFlags.IgnoreCase 
                    | System.Reflection.BindingFlags.NonPublic
                    | System.Reflection.BindingFlags.Static);
                func.Invoke(null, null);
            }
            Console.Read();
        }
输出: 
1fffffffffffffffffffffffffffffffff


<think>我们正在处理一个关于C#反射调用方法的问题。用户要求一个示例,展示如何使用反射调用方法。根据提供的引用,我们可以总结出以下步骤:1.获取类型(Type)信息,可以通过typeof(类名)或者实例.GetType()来获取。2.创建实例(如果方法不是静态的),可以使用Activator.CreateInstance方法。3.获取方法信息(MethodInfo),通过Type.GetMethod方法,传入方法名。4.调用方法,使用MethodInfo.Invoke方法,第一个参数是实例(如果是静态方法则传null),第二个参数是方法参数数组。引用中提供了几个例子:引用[1]:MethodInfo methodInfo =type.GetMethod("MethodName"); methodInfo.Invoke(instance,null);引用[2]:展示了完整的流程,包括获取类型、创建实例、获取方法调用。引用[3]:展示了一个类,其中包含实例方法静态方法(带参数和不带参数)的例子。因此,我们可以编写一个示例,包含以下三种情况:1.调用带参数的实例方法。2.调用带参数的静态方法。3.调用无参数的静态方法。同时,为了清晰,我们将创建一个名为ReflectionExample的类,其中包含这些方法。然后,在Main方法中演示如何使用反射调用这些方法。注意:在调用方法时,Invoke的第二个参数是一个object数组,包含方法的参数。如果方法没有参数,可以传递null或一个空数组。我们将按照以下步骤编写代码:1.定义包含不同类型方法的类。2.获取该类的Type对象。3.对于实例方法,创建实例。4.获取MethodInfo对象,指定方法名和参数类型(如果有重载,需要指定参数类型数组)。5.调用Invoke方法。另外,为了处理重载的情况,GetMethod方法可能需要传递参数类型数组来指定具体的方法。下面我们编写示例代码。</think>### C#反射调用方法示例 在C#中通过反射调用方法主要涉及以下步骤: ```csharp using System; using System.Reflection; public class ReflectionExample { // 实例方法 public void InstanceMethod(string message) { Console.WriteLine($"实例方法: {message}"); } // 静态方法 public static void StaticMethod(int number) { Console.WriteLine($"静态方法: {number}"); } } class Program { static void Main() { // 1. 获取类型信息 Type type = typeof(ReflectionExample); // 2. 创建实例(非静态方法需要) object instance = Activator.CreateInstance(type); // 3. 调用实例方法 MethodInfo instanceMethod = type.GetMethod("InstanceMethod"); instanceMethod.Invoke(instance, new object[] { "Hello Reflection" }); // 4. 调用静态方法 MethodInfo staticMethod = type.GetMethod("StaticMethod"); staticMethod.Invoke(null, new object[] { 42 }); // 静态方法实例参数为null // 5. 调用私有方法(需要BindingFlags) MethodInfo privateMethod = type.GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance); privateMethod.Invoke(instance, null); } } ``` **关键点说明:** 1. **获取方法信息**:使用`Type.GetMethod()`获取MethodInfo对象 2. **方法调用**: - 实例方法:`methodInfo.Invoke(instance, parameters)` - 静态方法:`methodInfo.Invoke(null, parameters)` 3. **参数传递**:参数以`object[]`数组形式传递 4. **访问修饰符处理**: - 私有方法需要指定`BindingFlags.NonPublic` - 默认只查找公共方法 **特殊场景处理:** ```csharp // 重载方法调用(指定参数类型) MethodInfo overloadedMethod = type.GetMethod("Method", new Type[] { typeof(string), typeof(int) }); // 泛型方法调用 MethodInfo genericMethod = type.GetMethod("GenericMethod"); MethodInfo constructed = genericMethod.MakeGenericMethod(typeof(string)); constructed.Invoke(instance, null); ``` **注意事项:** 1. 方法不存在时会抛出`MissingMethodException` 2. 参数类型不匹配会抛出`ArgumentException` 3. 性能考虑:反射调用比直接调用慢约100-1000倍[^1] 4. 安全性:反射需要相应的代码访问权限 [^1]: 反射的核心类:Type, MethodInfo, FieldInfo, PropertyInfo, ConstructorInfo 等类提供了丰富的反射功能 [^2]: using System.Reflection; Type type = typeof(Example); object instance = Activator.CreateInstance(type); // 获取方法信息 MethodInfo method = type.GetMethod("Print"); method.Invoke(instance, null); [^3]: c# invoke()使用。编写一个类 namespace ReflectionTest { public class WriteTest { //带参数的公共方法 public void WriteString(string s, int i) { Console.WriteLine("WriteString:" + s + i.ToString()); } //带一个参数的静态方法 public static void StaticWriteString(string s) { Console.WriteLine("StaticWriteString:" + s); } //不带参数的静态方法 public static void NoneParaWriteString() { Console.WriteLine("NoParaWriteString"); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三项超标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值