Как определить, имеет ли объект ConstructorInfo неуправляемый параметр? - PullRequest
6 голосов
/ 08 мая 2011

Мое приложение использует отражение для анализа кода на языке c ++ / cli во время выполнения.
Мне нужно определить, есть ли у типа конструктор без неуправляемых параметров (указателей и т. П.), Потому что я хочу позже использовать:

ConstructorInfo constructorInfo;  
// ...  
var ret = constructorInfo.Invoke(BindingFlags..., null, myParameters, null);  

если конструктор имеет указатель на неуправляемый объект в качестве параметра, возникает исключение при преобразовании, когда я передаю ему значение null.

Итак, как мне это определить?IsManaged нет ... и IsPointer в этом случае не помогает.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Непонятно, в чем ваша проблема на самом деле, но вот небольшая демонстрационная программа, которая показывает передачу null конструктору, который принимает указатель в качестве аргумента и обнаруживает его с помощью IsPointer:

using System;
using System.Reflection;

namespace pointers
{
    unsafe class Program
    {
        public Program(int* x)
        {
            Console.WriteLine("It worked!");
        }

        static void Main(string[] args)
        {
            ConstructorInfo[] c = typeof(Program).GetConstructors();
            c[0].Invoke(BindingFlags.Default, null, new object[] { null }, null);
            Console.WriteLine(c[0].GetParameters()[0].ParameterType.IsPointer);
        }
    }
}

Это печатает:

It worked!
True
0 голосов
/ 09 мая 2011

Попробуйте проверить, является ли параметр типом значения. null не является допустимым значением для любого типа значения, будь то неуправляемый указатель или просто int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...