【问题标题】:How to use reflection to get a method with a ref keyword?如何使用反射来获取带有 ref 关键字的方法?
【发布时间】:2018-05-19 21:28:54
【问题描述】:

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

【问题讨论】:

  • 嗯嗯嗯。是的,答案有帮助,但你真的认为我们问的是同一个问题吗?他的问题不是明确地与 ref/out 的 get 方法有关吗?所以只是为了清晰和简单,我希望它留下来。这当然不是我判断的:-)
  • 构建表达式基本上对所有事情都使用反射。答案的前几句话也是你问题的答案。所以我认为这是一个合适的。
  • @thehennyy 最主要的是,问题不在于创建(当然)使用反射的表达式,只是反射。
  • @ChristophWolf 下面的一行答案包含了如何做到这一点的想法。 GetMethod() 有一个接受参数参数数组的重载。

标签: c# reflection ref


【解决方案1】:

如果你混合 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 都扔在一起。静态和非静态的工作方式不同:-)

【讨论】:

  • 嗯,我使用这些绑定标志根据给定的名称查找所有方法。一开始我将静态和非静态分开。但后来我意识到我只需要检查 .isStatic 是否使用对象调用该方法。还是我错了? (到目前为止没有任何问题)(我在调用它们之前存储方法,以便仅在我真的需要时使用反射;-))
  • @ChristophWolf 如果您知道“必须”有一个方法,那么“正确”的做法是将您知道的所有详细信息提供给GetMethod()。对于使用泛型的更复杂的方法,我使用了一个小 LINQ 表达式和GetMethods()(参见例如here,我去寻找Enumerable.AnyEnumerable.Select 的第一部分)。我通常会尝试保护代码不仅不受将来我要查找的方法的签名的更改,甚至还可以防止可能添加的其他重载
  • 哈哈哈,不错!好吧,也许我会使用它,如果我的用户的需求如此复杂^^ 但通常我使用非常具体的字段属性。上述问题是内部流程的一个例外。但是谢谢你的想法,伙计;-)
【解决方案2】:

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

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

【讨论】:

  • 如果您详细说明,您的想法可以成为答案的一部分,但是,恕我直言,现在您的帖子不能称为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多