You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何通过字符串调用类实例的非静态方法?

解决方案

你之前的写法混淆了Type类和业务类的方法,InvokeMember是.NET框架里Type类的原生方法,不需要让你的testSuite继承Type,只要把你创建好的testSuite实例作为目标参数传入即可,同时要把绑定标志里的BindingFlags.Static替换为BindingFlags.Instance适配非静态方法。以下是两种可行的实现方案:

方案1:直接使用反射调用(实现简单)

直接沿用你之前的反射逻辑,调整参数即可:

testSuite myTest = new testSuite();

foreach (var checkedItem in checkedItems)
{
    if (tcToFuncDic.TryGetValue(checkedItem.ToString(), out string funcName))
    {
        tcResult = (testSuite.testResultInfo)typeof(testSuite).InvokeMember(
            funcName,
            BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, // 替换Static为Instance
            null,
            myTest, // 传入你已经实例化好的testSuite对象
            null // 方法无参数则传null,有参数时传入对应顺序的object数组
        );
    }
}

该方案无需修改现有类结构,实现成本极低,对于人工触发测试的场景,反射的性能开销完全可以忽略。

方案2:委托缓存方案(性能更优)

如果需要频繁调用测试方法,可以提前把方法名和对应委托缓存到字典,后续调用完全没有反射开销,性能和直接调用方法几乎一致:

  1. 首先定义匹配测试方法签名的委托,以及缓存字典:
// 委托签名和测试方法保持一致:无参数,返回testResultInfo
private delegate testSuite.testResultInfo TestCaseDelegate();
private Dictionary<string, TestCaseDelegate> _testCaseCache;
  1. 实例化testSuite后构建一次缓存:
testSuite myTest = new testSuite();
_testCaseCache = new Dictionary<string, TestCaseDelegate>();

// 筛选所有符合签名的测试方法,批量构建委托缓存
var testMethods = typeof(testSuite)
    .GetMethods(BindingFlags.Public | BindingFlags.Instance)
    .Where(m => m.ReturnType == typeof(testSuite.testResultInfo) && m.GetParameters().Length == 0);

foreach (var method in testMethods)
{
    var del = (TestCaseDelegate)Delegate.CreateDelegate(typeof(TestCaseDelegate), myTest, method);
    _testCaseCache.Add(method.Name, del);
}
  1. 后续调用直接从缓存取委托执行:
foreach (var checkedItem in checkedItems)
{
    if (tcToFuncDic.TryGetValue(checkedItem.ToString(), out string funcName)
        && _testCaseCache.TryGetValue(funcName, out var testFunc))
    {
        tcResult = testFunc.Invoke();
        // 处理测试结果逻辑
    }
}

注意事项

  • 如果后续测试方法需要增加参数,只要对应调整委托签名、调用时传入对应参数即可,两种方案都支持带参数的方法。
  • 请确保所有测试方法名唯一,避免缓存字典出现重复键异常。

内容的提问来源于stack exchange,提问作者Michael Riley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 18:42:03