2009-05-02 18 views
1

Gibt es eine Möglichkeit, "internen" Code über Reflektion auszuführen? HierC#, Internal und Reflection

ist ein Beispielprogramm:

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

eine Testklasse anlegen normalerweise perfekt funktioniert, aber wenn ich versuche, eine Instanz über Reflexion zu schaffen, habe ich eine Missingfehlermeldung erhalten dass es nicht den Konstruktor finden (die Was würde passieren, wenn Sie es von außerhalb der Versammlung anrufen würden?

Ist das unmöglich, oder gibt es eine Workaround, die ich tun kann?

Antwort

4

Basierend auf Preets Richtung auf einen anderen Beitrag:

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

Dies funktioniert. (Ein Argument hinzugefügt, um zu beweisen, dass es eine neue Instanz war).

stellt sich heraus, ich brauchte nur die Instanz und nichtöffentliche BindingFlags.

5

Hier ist ein Beispiel ...

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

Nur ein kurzer Hinweis, können Sie Types.EmptyTypes anstelle neuer Typ verwenden [0]. – Vinicius