【问题标题】:Type.InvokeMember and reference typesType.InvokeMember 和引用类型
【发布时间】:2011-03-17 21:19:08
【问题描述】:

我正在尝试将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的情况下,还有其他方法吗?

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    好的,您需要在此处进行两处更改:

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

    【讨论】:

    • 我宁愿不改变 A(或者它的方法 getReferenceType)。还有其他方法吗?
    • @Matt:不。A.GetReferenceType 是一个坏方法。这是一个无操作。它没有任何目的。您确实需要了解为什么会这样,以避免将来遇到类似的问题。
    • 感谢您的文章我现在明白了。在阅读之前,我从未真正看到通过引用传递引用类型的必要性!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多