c#、内部和反射
有没有办法通过反射来执行“内部”代码 以下是一个示例程序:c#、内部和反射,c#,reflection,internal,C#,Reflection,Internal,有没有办法通过反射来执行“内部”代码 以下是一个示例程序: using System; using System.Reflection; namespace ReflectionInternalTest { class Program { static void Main(string[] args) { Assembly asm = Assembly.GetExecutingAssembly();
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错误,表示它找不到构造函数(如果尝试从程序集外部调用它,就会发生这种情况)
这是不可能的,还是我可以做一些变通方法?这里有一个例子
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!") ;
}
}
这里有一个例子
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!") ;
}
}
根据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);
}
}
}
这很有效。(添加了一个论点以证明这是一个新实例)
原来我只需要实例和非公共绑定标志。根据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);
}
}
}
这很有效。(添加了一个论点以证明这是一个新实例)
原来我只需要实例和非公共绑定标志。如果您在C#4.0中,请使用AccessPrivateWrapper动态包装器。如果您在C#4.0中,请使用AccessPrivateWrapper动态包装器。只是一个快速提示,您可以使用Types.EmptyTypes而不是新类型[0]。只是一个快速提示,您可以使用Types.EmptyTypes而不是新类型[0]。链接已断开链接已断开