【问题标题】:dotnet, use dynamic object to initiate generic typedotnet,使用动态对象初始化泛型
【发布时间】:2023-01-30 18:25:29
【问题描述】:

我需要使用动态对象创建泛型类的实例

使用以下代码示例

using System;
using System.Dynamic;

public class Program
{
    public static void Main()
    {
        dynamic obj = new ExpandoObject();
        obj.num = 1;
        obj.str = "a";

        Type t = obj.GetType();
        Type myType = typeof(RulesService<>).MakeGenericType(t);
        object instance = Activator.CreateInstance(myType, 999);

        myType.GetMethod("GetMatchingRules")
            .Invoke(instance, obj);
    }
}

public class RulesService<T>
{
    private readonly int _retNum = 0;

    public RulesService(int retNum)
    {
        _retNum = retNum;
    }

    public int GetMatchingRules(T objectToMatch)
    {
        Console.WriteLine("GetMatchingRules");
        return _retNum;
    }
}

并获得下一个例外

未处理的异常。 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“System.Reflection.MethodBase.Invoke(object, object[])”的最佳重载方法匹配有一些无效参数 在 CallSite.Target(闭包,CallSite,MethodInfo,对象,对象) 在 System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid3[T0,T1,T2](CallSite 站点,T0 arg0,T1 arg1,T2 arg2) 在 Program.Main()

【问题讨论】:

  • 您是否尝试过在 Invoke 中显式创建 object[]? myType.GetMethod("GetMatchingRules").Invoke(instance, new object[] { obj });

标签: c# .net-core


【解决方案1】:

将对象包装到数组中:

myType.GetMethod("GetMatchingRules").Invoke(instance, new[]{ obj });

MethodBase.Invoke 需要一组参数,并将尝试将 obj 视为一个参数。如果您尝试将动态实例转换为 ExpandoObject (myType.GetMethod("GetMatchingRules).Invoke(instance, (ExpandoObject) obj);),问题就会变得清晰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2011-01-02
    • 2020-12-05
    • 2013-10-04
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多