سؤال

هل هناك طريقة لتنفيذ التعليمات البرمجية "الداخلية" عن طريق التفكير؟

وهنا هو برنامج سبيل المثال:

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 قائلا انه لا يمكن العثور على منشئ (وهو ما سيحدث إذا حاول استدعاء من خارج التجمع) .

وهذا هو المستحيل، أم أن هناك بعض الحل يمكنني أن أفعل؟

هل كانت مفيدة؟

المحلول 2

وبناء على التوجيه 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);
        }
    }
}

وهذا يعمل. (أضيف في حجة لاثبات ذلك كان مثيل جديد).

وتبين أنا فقط بحاجة إلى المثال وBindingFlags غير عامة.

نصائح أخرى

وهنا مثال ...

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

استخدم المجمع الحيوي AccessPrivateWrapper إذا كنت في C # 4.0 http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top