gpt4 book ai didi

c# - 输入和输出的 Co/Contra-Variance

转载 作者:太空宇宙 更新时间:2023-11-03 16:52:54 24 4
gpt4 key购买 nike

我对协方差/协方差有疑问。我知道你不能同时拥有输入和输出。所以这是一个简单的例子:

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可以分配objObject属性:

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对象作为输入!


既然你现在只能通过 BImplementorA<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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com