繁体   English   中英

Type.InvokeMember和引用类型

[英]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方法中使用outref参数很少是一个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM