我正在尝试将Type.InvokeMember(String, BindingFlags, Binder, Object, array [])与默认绑定器一起使用。
对象数组中目标方法的一个参数是设置为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
的情况下执行此操作?
答案 0 :(得分:7)
好的,您需要在此处进行两项更改:
制作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 }
将o
的值复制到数组中 - 它不会将该数组元素与o
变量相关联。
更好的解决方案是让GetReferenceType
返回新值,但是...使用out
或ref
很少是个好主意void
方法中的参数。