我想通过反射调用类的每个方法,但我不能使用指针作为引用来调用方法。通常情况下,我只需为找到的每个指针传递null,一切都会很好。问题在于当函数尝试访问我传递的指针时。指针将是对内存地址0的引用,这显然会导致我的程序立即崩溃。
因此,我需要传递一个指向有效内存地址的指针,但我不知道如何在运行时创建指针。
以下是代码的压缩版本:
我经常遇到异常"System.RuntimeType"无法转换为类型 'System.Char*' 奇怪的是,pointerInstance.GetType().MakePointerType()返回一个char*,这恰好是我需要传递给函数的...
因此,我需要传递一个指向有效内存地址的指针,但我不知道如何在运行时创建指针。
以下是代码的压缩版本:
class Program
{
static void Main(string[] args)
{
var obj = new TestClass();
var pointerMethod = obj.GetType().GetMethod("Test");
var referenceMethod = obj.GetType().GetMethod("Test2");
var pointerParameter = pointerMethod.GetParameters()[0];
var referenceParameter = referenceMethod.GetParameters()[0];
//Get the instance of the class that is referred by the pointer/reference
var pointerInstance = Activator.CreateInstance(pointerParameter.ParameterType.GetElementType());
var referenceInstance = Activator.CreateInstance(referenceParameter.ParameterType.GetElementType());
//Call the method and "cast" the char instance into an pointer
pointerMethod.Invoke(obj, new[] {pointerInstance.GetType().MakePointerType()});
referenceMethod.Invoke(obj, new[] { referenceInstance.GetType().MakeByRefType() });
}
}
还有一个TestClass:
public class TestClass
{
unsafe public void Test(char* pointer)
{
}
public void Test2(ref int reference)
{
}
}
我经常遇到异常"System.RuntimeType"无法转换为类型 'System.Char*' 奇怪的是,pointerInstance.GetType().MakePointerType()返回一个char*,这恰好是我需要传递给函数的...
ref
是一个修饰符,不是一种类型。) 如果你能提供一个简短但完整的程序来演示问题,那将非常有帮助。此外,我建议你尝试使用仅仅一个ref参数或仅仅一个指针参数 - 否则你将不知道哪个出了问题... - Jon Skeetref
版本是否有效?如果是,请删除它 - 集中精力解决一个问题比展示两个问题更好。 - Jon SkeetInvoke
的第二个参数应该是要传递的参数,而不是参数的类型... - Jon Skeet