代码之家  ›  专栏  ›  技术社区  ›  cyberconte

C、内部和反射

  •  0
  • cyberconte  · 技术社区  · 15 年前

    有没有通过反射来执行“内部”代码的方法?

    下面是一个示例程序:

    using System;
    using System.Reflection;
    
    namespace ReflectionInternalTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly asm = Assembly.GetExecutingAssembly();
    
                // Call normally
                new TestClass();
    
                // Call with Reflection
                asm.CreateInstance("ReflectionInternalTest.TestClass", 
                    false, 
                    BindingFlags.Default | BindingFlags.CreateInstance, 
                    null, 
                    null, 
                    null, 
                    null);
    
                // Pause
                Console.ReadLine();
            }
        }
    
        class TestClass
        {
            internal TestClass()
            {
                Console.WriteLine("Test class instantiated");
            }
        }
    }
    

    创建一个testclass通常工作得很好,但是当我试图通过反射创建一个实例时,我得到一个MissingMethodException错误,它说找不到构造函数(如果您试图从程序集外部调用它,就会发生这种情况)。

    这是不可能的,还是我可以做些变通的工作?

    3 回复  |  直到 13 年前
        1
  •  5
  •   JP Alioto    15 年前

    下面是一个例子…

      class Program
        {
            static void Main(string[] args)
            {
                var tr = typeof(TestReflection);
    
                var ctr = tr.GetConstructor( 
                    BindingFlags.NonPublic | 
                    BindingFlags.Instance,
                    null, new Type[0], null);
    
                var obj = ctr.Invoke(null);
    
                ((TestReflection)obj).DoThatThang();
    
                Console.ReadLine();
            }
        }
    
        class TestReflection
        {
            internal TestReflection( )
            {
    
            }
    
            public void DoThatThang()
            {
                Console.WriteLine("Done!") ;
            }
        }
    
        2
  •  4
  •   cyberconte    15 年前

    根据Preets指向备用桩的方向:

    using System;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    
    namespace ReflectionInternalTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly asm = Assembly.GetExecutingAssembly();
    
                // Call normally
                new TestClass(1234);
    
                // Call with Reflection
                asm.CreateInstance("ReflectionInternalTest.TestClass", 
                    false, 
                    BindingFlags.Default | BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, 
                    null, 
                    new Object[] {9876}, 
                    null, 
                    null);
    
                // Pause
                Console.ReadLine();
            }
        }
    
        class TestClass
        {
            internal TestClass(Int32 id)
            {
                Console.WriteLine("Test class instantiated with id: " + id);
            }
        }
    }
    

    这是可行的。(添加了一个论证来证明这是一个新的实例)。

    结果发现我只需要实例和非公共绑定标志。

        3
  •  1
  •   amazedsaint    14 年前

    如果您在C 4.0中,请使用AccessPrivateWrapper动态Wrapper http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html