正如您所说,您不能同时拥有输入和输出,所以让我们改变一下
A<T>
到
A<in T>
所以
Command
可以分配
obj
到
Object
财产:
public interface A<in T>
{
void SetObject(T obj);
}
public interface B { }
public class BImplementor : B { }
public class Implementor : A<BImplementor>
{
public void SetObject(BImplementor t) { ... }
}
这个
命令
方法基本上是这样做的:
public void Command(B obj)
{
A<B> a = (A<B>)new Implementor();
a.SetObject(obj);
}
但是这个演员永远不会成功,因为
A<B>.SetObject
必须接受任何
B
作为输入,同时
Implementor.SetObject
只接受
BImplementor
对象作为输入!
既然你现在只会通过
二者
到
A<B>.setObject对象
,您可以使用反射来解决问题。
工作1:
public void Command1(B obj)
{
object a = Unity.Resolve(typeof(A<>).MakeGenericType(obj.GetType());
a.GetType().GetMethod("SetObject").Invoke(a, new object[] { obj });
}
工作2:
public void Command(B obj)
{
this.GetType()
.GetMethod("Command2")
.MakeGenericMethod(obj.GetType())
.Invoke(this, new object[] { obj });
}
public void Command2<T>(T obj) where T : B
{
A<T> a = Unity.Resolve<A<T>>();
a.SetObject(obj);
}