- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对协方差/协方差有疑问。我知道你不能同时拥有输入和输出。所以这是一个简单的例子:
public interface A<T>
{
T Object {get;set;}
}
public interface B
{
// Some stuff
}
public class BImplementor : B
{ }
public class Implementor : A<BImplementor> {}
假设你有这些类,我想写一个这样的方法
public void Command(B obj)
{
var a = (A<B>)Unity.Resolve(typeof(A<>).MakeGenericType(obj.GetType());
a.Object = obj;
}
我正在使用 Unity 解决 A
B
的具体实现者(特别是 Implementor
),但我所知道的是它是一个 A<B>
.我不知道有什么方法可以直接执行此操作,而且我认为这实际上是不可能的,但是有没有人知道一种解决方法来模拟我正在尝试执行的操作。
最佳答案
正如你所说,你不能同时拥有输入和输出,所以让我们改变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) { ... }
}
Command
方法本质上是这样做的:
public void Command(B obj)
{
A<B> a = (A<B>)new Implementor();
a.SetObject(obj);
}
但是这个转换永远不会成功,因为A<B>.SetObject
必须接受任何 B
作为输入,同时 Implementor.SetObject
只接受 BImplementor
对象作为输入!
既然你现在只能通过 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);
}
关于c# - 输入和输出的 Co/Contra-Variance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303274/
我有这样的特质: trait CanFold[-T, R] { def sum(acc: R, elem: T): R def zero: R } 使用一个像这样使用它的函数: def sum
我对协方差/协方差有疑问。我知道你不能同时拥有输入和输出。所以这是一个简单的例子: public interface A { T Object {get;set;} } public inte
继 this question ,有人可以在 Scala 中解释以下内容: class Slot[+T] (var some: T) { // DOES NOT COMPILE //
任何需要运行时值来构造特定依赖项的地方,抽象工厂都是解决方案。 我的问题是:为什么许多消息来源更喜欢 FactoryInterface 而不是 FactoryDelegate 来实现这种模式?这两
我是一名优秀的程序员,十分优秀!