Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用反射来获取带有ref关键字的方法?_C#_Reflection_Ref - Fatal编程技术网

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

C# 如何使用反射来获取带有ref关键字的方法?,c#,reflection,ref,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) }; Me

是的,所以我建立了一个小的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);
}

我该怎么办?到目前为止,我在web上找不到任何东西(特别是GetMethod)

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

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

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

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

如果将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()
,以及包含参数的
对象[]
数组被调用的方法修改的事实。我添加了第二个带有
out
的示例,表明您仍然使用
.MakeByRefType()
,只是不需要使用参数初始化
对象[]
数组。啊,您应该使用所需的确切的
BindingFlags
,而不是将MSDN中包含的所有
BindingFlags
一起抛出。静态和非静态工作方式不同:-)

如果将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()
,以及包含参数的
对象[]
数组被调用的方法修改的事实。我添加了第二个带有
out
的示例,表明您仍然使用
.MakeByRefType()
,只是不需要使用参数初始化
对象[]
数组。啊,您应该使用所需的确切的
BindingFlags
,而不是将MSDN中包含的所有
BindingFlags
一起抛出。静态和非静态工作方式不同:-)

hmmmmm。是的,答案很有帮助,但你真的认为我们问的是同一个问题吗?他的问题并不是关于带有ref/out的get方法?因此,为了清晰和简单起见,我希望它保持不变。这当然不是由我来判断的:-)建筑表达式基本上对所有事物都使用反射。答案的前几个字也是你问题的答案。所以我认为这是一个合适的选择。@Thenyy主要的问题是,问题不在于创建(当然)使用反射的表达式,而只是反射。@ChristophWolf下面的一行回答包含了如何做的想法。具有接受参数数组的重载。hmmmmm。是的,答案很有帮助,但你真的认为我们问的是同一个问题吗?他的问题并不是关于带有ref/out的get方法?因此,为了清晰和简单起见,我希望它保持不变。这当然不是由我来判断的:-)建筑表达式基本上对所有事物都使用反射。答案的前几个字也是你问题的答案。所以我认为这是一个合适的选择。@Thenyy主要的问题是,问题不在于创建(当然)使用反射的表达式,而只是反射。@ChristophWolf下面的一行回答包含了如何做的想法。有一个重载,它包含一系列参数。如果你详细说明,你的想法可以是答案的一部分,但是,imho,现在你的帖子不能被称为答案。如果你详细说明,你的想法可以是答案的一部分,但是,imho,现在你的帖子不能被称为答案。嗯,我使用那些绑定标志来查找存在的每个方法,基于给定的名称。一开始我把静态和非静态分开。但后来我意识到我只需要检查.isStatic是否使用对象调用该方法。还是我错了?(到目前为止没有任何问题)(我在调用方法之前存储这些方法,以便在我确实必须使用反射时使用它们;-)@ChristophWolf如果您知道方法“必须”存在,“正确”的做法是将您知道的所有细节提供给
GetMethod()
。对于使用泛型的更复杂的方法,我使用了一个小LINQ表达式和
GetMethods()
(例如,请参见我查找
Enumerable.Any
Enumerable.Select的第一部分)。我通常会尽力保护代码,不只是为了防止我所寻找的方法的签名将来发生变化,甚至是为了可能被添加的额外重载。哈哈,太好了!如果我的用户的需求非常复杂,那么我可能会使用它,但是通常我使用非常具体的字段属性。上述问题是内部流程的一个例外。但是谢谢你的主意,伙计;-)嗯,我使用这些绑定标志根据给定的名称查找存在的每个方法。一开始我把静态和非静态分开。但后来我意识到我只需要检查.isStatic是否使用对象调用该方法。还是我错了?(到目前为止没有任何问题)(我在调用方法之前存储这些方法,以便在我确实必须使用反射时使用它们;-)@ChristophWolf如果您知道方法“必须”存在,“正确”的做法是将您知道的所有细节提供给
GetMethod()
。对于使用泛型的更复杂的方法,我使用了一个小LINQ表达式和
GetMethods()
(例如,请参见我查找
Enumerable.Any
Enumerable.Select的第一部分)。我通常会尽力保护代码,不只是为了防止我所寻找的方法的签名将来发生变化,甚至是为了可能被添加的额外重载。哈哈,太好了!如果我的用户的需求非常复杂,那么我可能会使用它,但是通常我使用非常具体的字段属性。上述问题是内部流程的一个例外。但是谢谢你的主意,伙计;-)