gpt4 book ai didi

c# - Type.InvokeMember 和引用类型

转载 作者:行者123 更新时间:2023-11-30 20:11:47 26 4
gpt4 key购买 nike

我正在尝试使用 Type.InvokeMember(String, BindingFlags, Binder, Object, array []) 使用默认 Binder 。

对象数组中目标方法的参数之一是设置为 null 的引用类型。我希望我正在调用的方法实例化引用类型,以便我可以继续使用它。例如:

using System;

namespace ConsoleApplication6
{
class A
{
public void GetReferenceType(object o)
{
o = new object();
}
}

class Program
{
static void Main(string[] args)
{
object o = null;
A a = new A();
Type t = typeof(A);
t.InvokeMember("GetReferenceType", System.Reflection.BindingFlags.InvokeMethod, null, a, new object[] { o });

if (o == null)
{
throw new NullReferenceException();
}
else
{
//do something with o;
}
}
}
}

解决方法是给 A 一个属性并通过它访问 o。

有没有不改变 A 的另一种方法?

最佳答案

好的,这里需要做两处改动:

  • 使您的 GetReferenceType 参数 ref:

    public void GetReferenceType(ref object o)

    必须这样做,因为目前您的方法对外界是空操作。你应该读我的article on parameter handling in C# .

  • InvokeMember 之后使用数组中的值,而不是原始引用:

    A a = new A();
    Type t = typeof(A);
    object[] args = new object[] { null };
    t.InvokeMember("GetReferenceType", BindingFlags.InvokeMethod,
    null, a, args);
    object o = args[0];

当您创建数组时,例如使用 new object[] { o } 只是将 ovalue 复制到数组中 - 它不会将该数组元素与o 变量。

更好的解决方案是让 GetReferenceType 返回 新值,但是...使用 out 很少是个好主意或 void 方法中的 ref 参数。

关于c# - Type.InvokeMember 和引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3280851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com