4

すべてがほぼ正しいように見えても、Type.GetMethod()を呼び出す関数に対してAmbigiousMatchExceptionが発生します。

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);のエラー

私は何が間違っているのですか?どうすればこれを修正できますか?

4

2 に答える 2

2

エラーメッセージに基づいて、WriteToLogLoggingFactoryまたはその継承チェーンにすでに関数がある可能性があります。

于 2011-11-19T02:24:16.597 に答える
1

あなたは不必要に物事を複雑にしているようです。関数とその引数の両方は、リストに追加するときはいつでもわかります。そのような無名関数の使用を検討していますか。例として、このオブジェクトをラップしました。この例の文字列引数。DynamicInvokeもかなり遅くなります。

また、2つの異なるタイプが同じ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;
    }
}
于 2011-11-19T02:24:20.883 に答える