使用所述类型

时间:2017-04-26 10:51:57

标签: c# reflection

我有一个带有一些带有回调的构造函数的类X,其中回调传回X的实例:

class X
{
    public X(Action<X> callback) { ... }
}

由于我无法访问班级X(它在另一个装配中的内部),我使用反射来获取类型和构造函数,所以到目前为止好。不用担心,这样的东西不能用于生产,它只是用于测试目的。

但是,如果我无法静态访问X,如何键入回调? Action<object>给出了调用时的转换错误(可以理解)。注意我实际上并不关心X类型,对象表示没问题。

由于

编辑:根据请求,这里是调用上下文:

    public static object CreateCallbackType(Action<object> onNewData)
    {
        if (s_staticType == null)
        {
            var assembly = Assembly.Load("<>");
            var types = assembly.GetTypes();

            foreach (var t in types)
            {
                if (t.Name == "<X>")
                {
                    s_staticType = t;
                    break;
                }
            }

            if (s_staticType == null)
                return null;
        }

        return Activator.CreateInstance(s_staticType, onNewData);
    }

1 个答案:

答案 0 :(得分:2)

Action<T>委托是逆变的,所以你可以简单地说:

public static void Callback(object par)
{
    Console.WriteLine(par.ToString());
}

在这种情况下,逆变意味着您可以传递Action<X>而不是传递Action<anybaseclassofX>,而Action<object>就可以了。

然后:

var res = constructor.Invoke(new object[] { (Action<object>)Callback });

var res = Activator.CreateInstance(type, (Action<object>)Callback);

请注意,逆转仅适用于参考类型:X必须是class,而不是struct