如何使用反射来获取带有ref关键字的方法?

时间:2018-05-19 21:28:55

标签: c# reflection ref

是的,所以我设置了一个小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 :(得分:2)

如果你混合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,而不是将MSDN中包含的每个BindingFlags放在一起。静态和非静态工作方式不同: - )

答案 1 :(得分:0)

通过调用GetMethod的适当重载,您可以找到具有指定参数类型的方法。要使参数成为引用类型,请使用代码:

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