Я хочу вызвать с отражением каждый метод класса, но я не могу вызвать методы с указателем в качестве ссылки. Обычно я просто могу передать null для каждого указателя, который я нахожу, и все будет хорошо. Проблема заключается в том, когда функция пытается получить доступ к моему пройденному указателю. Указатель будет ссылкой на адрес памяти 0, и это, очевидно, мгновенный сбой для моей Программы. Поэтому мне нужно передать указатель на действительный адреса памяти, но я не знаю, как я могу создать указатель во время выполненияC# Метод вызова рефлексии с параметром ref/Pointer
сжатая версия моего кода:
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() возвращает символ *, именно то, что Мне нужно перейти в удовольствие ction ...
Объявление метода недействительно для начала - вы не указали тип параметра. ('ref' - это модификатор, а не тип.) Если бы вы могли предоставить короткую, но * полную * программу, демонстрирующую проблему, это очень помогло бы. Кроме того, я предлагаю вам попробовать с * просто * параметром ref или * просто * указательным параметром - иначе вы не узнаете, какой из них неисправен ... –
Я отредактировал свой пост и сжал код – Djeurissen
Но все же не включен короткую, но полную программу, которую я могу просто скопировать, вставить, скомпилировать и запустить. И работает ли 'ref' версия? Если это так, удалите его - лучше было бы сосредоточиться на * одной * проблеме, а не показывать два. –