Type.InvokeMember和引用类型

时间:2010-07-19 12:04:50

标签: c# .net 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;
            }
        }
    }
}

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

是否有另一种方法可以在不更改A的情况下执行此操作?

1 个答案:

答案 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 返回新值,但是...使用outref很少是个好主意void方法中的参数。