Как использовать отражение, чтобы получить метод с ключевым словом ref? - PullRequest
0 голосов
/ 20 мая 2018

Да, поэтому я настроил небольшой TestClass, чтобы выяснить, как GetMethod будет работать, чтобы найти метод Test (ref int i).Но пока ничего не получалось.

[Button(nameof(Method))]
public bool whatever;

private void Test(ref int i)
{
    Debug.Log("Works");
}

private void Method()
{
    Type[] types = { typeof(int) };
    MethodInfo methodInfo = GetType().GetMethod(nameof(Test),
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static,
        null, types, null);
    Debug.Log(methodInfo);
}

Что мне делать?До сих пор я не мог найти что-либо в Интернете (особенно для GetMethod)

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Если вы смешаете Eser + gcores, вы получите:

private void Test(ref int i)
{
    Console.WriteLine(i);
    i++;
}

private void Test2(out int i)
{
    i = 1000;
}

public void Method()
{
    Type[] types = { typeof(int).MakeByRefType() };

    MethodInfo methodInfo = GetType().GetMethod(nameof(Test), BindingFlags.NonPublic | BindingFlags.Instance, null, types, null);

    int num = 10;
    var pars = new object[] { num };
    methodInfo.Invoke(this, pars);
    Console.WriteLine(pars[0]);

    MethodInfo methodInfo2 = GetType().GetMethod(nameof(Test2), BindingFlags.NonPublic | BindingFlags.Instance, null, types, null);

    var pars2 = new object[1];
    methodInfo2.Invoke(this, pars2);
    Console.WriteLine(pars2[0]);
}

Обратите внимание на typeof(int).MakeByRefType() и тот факт, что массив object[], содержащий параметры, изменяется вызываемым методом.Я добавил второй пример с out, который показывает, что вы все еще используете .MakeByRefType(), только вам не нужно инициализировать массив object[] с параметром.И вы должны использовать именно то, что вам нужно BindingFlags, а не бросать все BindingFlags, содержащиеся в MSDN вместе.Статические и нестатические работы по-разному: -)

0 голосов
/ 20 мая 2018

Вы можете найти метод с указанными типами аргументов, вызвав соответствующую перегрузку GetMethod.Чтобы сделать параметр ссылочным типом, используйте код:

Type[] types = { typeof(int).MakeByRefType() };
...