Вызвать «внутренний внешний» конструктор, используя отражения - PullRequest
0 голосов
/ 16 апреля 2010

У меня следующий класс (как видно через отражатель)

public class W : IDisposable
{
    public W(string s);
    public W(string s, byte[] data);

    // more constructors

    [MethodImpl(MethodImplOptions.InternalCall)]
    internal extern W(string s, int i);

    public static W Func(string s, int i);

}

Я пытаюсь вызвать конструктор "external extern" или Func, используя отражения

MethodInfo dynMethod = typeof(W).GetMethod("Func", BindingFlags.Static);                
object[] argVals = new object[] { "hi", 1 };
dynMethod.Invoke(null, argVals);

и

Type type = typeof(W);
Type[] argTypes = new Type[] { typeof(System.String), typeof(System.Int32) };
ConstructorInfo dynMethod = type.GetConstructor(BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, argTypes, null);
object[] argVals = new object[] { "hi", 1 };
dynMethod.Invoke(null, argVals);

к сожалению, оба варианта вызывают NullReferenceException при попытке вызвать, поэтому я должен что-то делать не так?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

Использование Activator обычно хорошая идея, но вы должны использовать вызов с BindingFlags в качестве входного параметра, чтобы использовать его для внутреннего конструктора.

В вашем коде есть несколько разных ошибок. Вы используете неправильные BindingFlags как во фрагментах, так и в фрагменте конструктора, вы использовали неправильный метод Invoke. Вот код, который должен работать:

MethodInfo dynMethod = typeof(W).GetMethod("Func", BindingFlags.Static | BindingFlags.Public);
object[] argVals = new object[] { "hi", 1 };
dynMethod.Invoke(null, argVals);


Type type = typeof(W);
Type[] argTypes = new Type[] { typeof(System.String), typeof(System.Int32) };
ConstructorInfo dynMethod = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, argTypes, null);
object[] argVals = new object[] { "hi", 1 };
dynMethod.Invoke(argVals);

Activator.CreateInstance(typeof(W), BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { "hi", 1 }, null);
2 голосов
/ 16 апреля 2010

Вам нужно позвонить Activator.CreateInstance:

Activator.CreateInstance(typeof(W), "hi", 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...