[英]Type.InvokeMember and reference types
我试图将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
呢?
好的,您需要在此处进行两项更改:
使您的GetReferenceType
参数ref
:
public void GetReferenceType(ref object o)
您必须执行此操作,因为当前您的方法对外界是禁止的。 您应该阅读有关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
返回新值,但是...在void
方法中使用out
或ref
参数很少是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.