Как вызвать DynamicInvoke для выраженияс помощью компиляции? - PullRequest
2 голосов
/ 18 июня 2011

Почему это не работает?

namespace InvokeTest
{
    public class MethodInvoker
    {
        public static void Execute<T>(Expression<Action<T>> call)
        {
            // Parameter count mismatch
            call.Compile().DynamicInvoke();

            // Also attempted this:
            //call.Compile().DynamicInvoke(1);
            // but it threw: "Object of type 'System.Int32' cannot be converted to type 'InvokeTest.TestClass'."
        }
    }

    public class TestClass
    {
        public TestClass()
        { }

        public void DoSomething(int num)
        {
            System.Console.WriteLine("It works");
        }

        public void KickOff()
        {
            MethodInvoker.Execute<TestClass>(m => m.DoSomething(1));
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Action<T> совпадает с delegate void F<T>(T t).То есть Action<T> - это метод, который имеет тип возврата void и использует экземпляры T.

Когда вы вызываете

MethodInvoker.Execute<TestClass>(m => m.DoSomething(1));

, вы установили параметр типа T будет TestClass.Следовательно, вам нужно передать параметр, и этот параметр должен быть экземпляром TestClass.

. Поэтому в первом случае вы получаете несоответствие количества параметров, а во втором - компилятор хочетпреобразовать параметр в экземпляр TestClass.Вам нужно передать один параметр, и этот параметр должен быть экземпляром TestClass.

Обратите внимание, что ваше действие

m => m.DoSomething(1).

Таким образом, ваше действие принимает экземпляр TestClassкоторый вы параметризуете m и вызывает m.DoSomething(1) для этого экземпляра.Теперь, когда вы динамически вызываете этот метод, вам нужно дать ему экземпляр TestClass.Вы этого не делаете.

1 голос
/ 18 июня 2011

Поскольку вы определили тип параметра

Expression<Action<T>>

, для функции потребуется выражение в соответствии со следующим делегатом:

Action<TestClass>

, что:

public void SampleMethod(TestClass a)

Исходя из этого, правильный вызов должен выглядеть следующим образом:

var t = new TestClass();
call.Compile().DynamicInvoke(t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...