C# 使用所述类型的回调调用反射类型上的构造函数

C# 使用所述类型的回调调用反射类型上的构造函数,c#,reflection,C#,Reflection,我有一个类X,它有一个回调函数,回调函数会传回X的实例: class X { public X(Action<X> callback) { ... } } 操作委托是逆变的,因此您可以简单地: public static void Callback(object par) { Console.WriteLine(par.ToString()); } 在这种情况下,逆变意味着可以传递动作,而不是传递动作,因此显然动作是可以的 然后: var res = constr

我有一个类X,它有一个回调函数,回调函数会传回X的实例:

class X
{
    public X(Action<X> callback) { ... }
}
操作
委托是逆变的,因此您可以简单地:

public static void Callback(object par)
{
    Console.WriteLine(par.ToString());
}
在这种情况下,逆变意味着可以传递
动作
,而不是传递
动作
,因此显然
动作
是可以的

然后:

var res = constructor.Invoke(new object[] { (Action<object>)Callback });
var res=constructor.Invoke(新对象[]{(操作)回调});

var res=Activator.CreateInstance(类型,(操作)回调);

请注意,逆变仅适用于引用类型:
X
必须是
类,而不是
结构

当构造函数返回
X
实例时,为什么要使用该实例进行回调?并展示你用来创建它的代码,否则我们怎么知道你在做什么?提供一个。因为你不知道
X
在外面,我无法想象为什么有人会使用一个回调,期望得到一个
X
的实例,而这个实例他根本无法访问。@TheLathalCoder我无法显示创建它的代码-这正是问题所在?回调被异步回调,并在不同线程上的许多实例之间进行多路复用,因此X对象用于标识和映射(但有其他我不关心的特性)。@Shaggi
我使用反射来获取类型和构造函数,到目前为止还不错。
您正在尝试创建您所评论的
X
的实例。显示代码。这个问题归结为:“如何在X受保护的情况下实例化操作?”但在本例中,情况正好相反:
X
调用类型化回调(接收
X
输入参数),接口的客户端拥有
操作
?我本可以假设Contravance无论如何都可以工作,但正如前面所说的,当直接调用构造函数(通过ConstructorInfo)时,我会出现强制转换错误,或者在使用Activator时会出现不匹配错误。CreateInstance@Shaggi使用不朽的短语:它在我的计算机(和Ideone)上工作:
var res = constructor.Invoke(new object[] { (Action<object>)Callback });
var res = Activator.CreateInstance(type, (Action<object>)Callback);