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

c#、内部和反射

  •  1
  • cyberconte  · 技术社区  · 16 年前

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

    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");
            }
        }
    }
    

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

    这是不可能的,还是我可以做一些变通方法?

    3 回复  |  直到 14 年前
        1
  •  5
  •   JP Alioto    16 年前

    这里有一个例子。..

      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    16 年前

    根据普里茨对候补职位的指示:

    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    15 年前

    如果您使用的是C#4.0,请使用AccessPrivateWrapper动态包装器 http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html