ج # الداخلية، والتأمل
-
03-07-2019 - |
سؤال
هل هناك طريقة لتنفيذ التعليمات البرمجية "الداخلية" عن طريق التفكير؟
وهنا هو برنامج سبيل المثال:
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
لا تنتمي إلى StackOverflow