我有一个带有一些带有回调的构造函数的类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);
}
答案 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
!