0

メソッドラッパーを動的に生成しようとしています。概念実証のために、何もしないラッパーが必要です。コードは次のようになります。

cSomeClassName testObject = new cSomeClassName();

dynamic wrapperObject = new ExpandoObject() as IDictionary<string, Object>;

foreach (var method in typeof(cSomeClassName).GetMethods())
{
    wrapperObject.Add(method.Name, 
                     (method.GetParameters()) => testObject.CallMethodWithParams(method.Name, method.GetParameters()));
}

電話をかける

testObject.MethodName(params);

と同等になります

wrapperObject.MethodName(params);

これが非常に壊れた実装例であることは認識していますが、改善する方法がわかりません。

4

1 に答える 1

0

多くの陪審の談合の後、私はあなたに解決策を与えます:

class cMethodExecutor
{
    private ArrayList m_ArgumentList;
    private Object m_CallObject;
    private string m_MethodName;

    public cMethodExecutor(Object iObject)
    {
        m_CallObject = iObject;
        m_ArgumentList = new ArrayList();
        m_MethodName = "";
    }

    public void SetMethodName(string iMethodName)
    {
        m_MethodName = iMethodName;
    }

    public void AddArgument(Object iArgument)
    {
        m_ArgumentList.Add(iArgument);
    }

    public object Execute()
    {
        return m_CallObject.GetType().GetMethod(m_MethodName).Invoke(m_CallObject, m_ArgumentList.ToArray());
    }
}


public delegate object ParamsFunc(params object[] iArgs);


//For now, we're going to just fall through to the original object:
IDictionary<string, object> obj = new ExpandoObject();

foreach (var method in typeof(cTestTarget).GetMethods())
{

    Console.WriteLine("Adding method: " + method.Name + "\n");

    obj.Add(method.Name, new ParamsFunc( inputList =>
    {
        cMethodExecutor newExecutor = new cMethodExecutor(iTestTarget);
        newExecutor.SetMethodName(method.Name);
        foreach (var param in inputList)
        {
            newExecutor.AddArgument(param);
        }

        return newExecutor.Execute();

    }));
}

iTestTarget に存在していたメソッドはすべて obj に存在し、元の​​ iTestTarget にディスパッチされます。

于 2013-05-29T00:27:33.047 に答える