使用反射调用“内部extern”构造函数

时间:2010-04-16 16:44:40

标签: c# reflection mono

我有以下课程(通过反射器看到)

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);

}

我试图使用反射调用“内部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 个答案:

答案 0 :(得分:3)

使用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);

答案 1 :(得分:2)

您需要致电Activator.CreateInstance

Activator.CreateInstance(typeof(W), "hi", 1);