【问题标题】:C# Dynamic Function AmbigiousMatchException?C# 动态函数 AmbigiousMatchException?
【发布时间】:2011-11-19 01:53:32
【问题描述】:

我得到一个 AmbigiousMatchException 函数调用 Type.GetMethod() 即使一切看起来都非常正确。

public partial class IBaseEvent
{
    private Dictionary<int, Func<object[], object>> funcs = new Dictionary<int,Func<object[],object>>();
    private Dictionary<int, object[]> func_args = new Dictionary<int,object[]>();

    public void Execute()
    {
        int exp = 0;
        foreach(var func in funcs)
        {
            exp = func.GetHashCode();
            func.Value.DynamicInvoke(func_args[exp]);
        }
    }

    public void AddFunction(Type T, dynamic sFunc, params object[] parameters)
    {
        funcs.Add(T.GetHashCode(), new Func<object[],object>(T.GetMethod(sFunc)));
        func_args.Add(T.GetHashCode(), parameters);
    }
}

public class DummyEvent : IBaseEvent
{
    private string EventType = "DUMMY_EVENT";

    public DummyEvent()
    {
        object[] parm = new object[3];
        parm[0] = Logging.LOG_TYPE.DEBUG;
        parm[1] = "Hello World from DummyEvent! TypeCode: {0}";
        parm[2] = typeof(DummyEvent).GetType().GUID;

        AddFunction(typeof(Logging.LoggingFactory), "WriteToLog", parm);
    }
}

AddFunction 上的错误(typeof(Logging.LoggingFactory), "WriteToLog", parm);

我做错了什么?我该如何纠正这个问题?

【问题讨论】:

  • 你能分享你的Logging类吗?

标签: c# function exception dynamic ambiguous


【解决方案1】:

根据错误信息,我怀疑你可能在 LoggingFactory 或其继承链中已经有一个函数WriteToLog

【讨论】:

  • 是的,有两个具有不同参数计数的 WriteToLog 函数。一个是 public static int WriteToLog(LOG_TYPE pType, string Message) 另一个是 public static int WriteToLog(LOG_TYPE pType, string pFormat, params object[] pParams
  • 问题是第二个重载与第一个重载基本上没有区别,除非您提供参数。如果可以的话,我建议添加另一个无操作参数或更改前两个参数的顺序。
【解决方案2】:

您似乎在不必要地使事情复杂化。每当您将其添加到列表中时,该函数及其参数都是已知的。您是否考虑使用这样的匿名函数。作为一个例子,我已经包装了这个对象..这个例子中的字符串参数。 DynamicInvoke 也会相当慢。

两种不同的类型也可以返回相同的 GetHashCode,这取决于您的特定需求可能会或可能无关紧要。

public partial class IBaseEvent
    {
        private Dictionary<int, Action> funcs = new Dictionary<int, Action>();

        public void Execute()
        {
            foreach (var func in funcs.Values)
            {
                func();
            }
        }

        public void AddFunction(Type t, Action ff)
        {
            funcs.Add(t.GetHashCode(), ff);
        }
    }

    public class DummyEvent : IBaseEvent
    {
        private string EventType = "DUMMY_EVENT";

        private void DoSomething(string x)
        {
            Console.WriteLine(x);
        }

        public DummyEvent()
        {
            Action temp = () =>
                {
                    DoSomething("Hello World from DummyEvent! TypeCode");
                };

            AddFunction(typeof(Logging), temp);
        }
    }

如果类型不是严格需要的,你可以像这样进一步简单

 public partial class IBaseEvent
{
    public Action MyAction;


    public void Execute()
    {
        MyAction();
    }

    public void AddFunction(Action ff)
    {
        MyAction += ff;
    }
}

【讨论】:

  • 我只是将哈希码用作临时存储。在函数执行后,它通常会从处理队列中删除,这就是为什么哈希码也并不重要。
  • 如果不是严格需要类型映射,我已经编辑了我的答案以进一步简化它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多