Mat*_*sen 2 .net c# reflection
我正在尝试将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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
解决方法是提供A一个属性并通过它访问o.
还有其他方法可以不改变A吗?
好的,您需要在此处进行两项更改:
制作你的GetReferenceType参数ref:
public void GetReferenceType(ref object o)
Run Code Online (Sandbox Code Playgroud)
你必须这样做,因为目前你的方法是对外界的无操作.您应该阅读我在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];
Run Code Online (Sandbox Code Playgroud)当您创建,例如用一个数组new object[] { o },只是复制值的o入阵-它不与该数组元素相关联o的变量.
一个更好的解决方案是GetReferenceType 返回新值,但是... 在方法中使用out或ref参数很少是个好主意void.
| 归档时间: |
|
| 查看次数: |
3744 次 |
| 最近记录: |