gpt4 book ai didi

c# - 如何通过C#在动态代理中调用泛型函数

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:39 26 4
gpt4 key购买 nike

java版本:我有如下通用功能:

public <T, K> JsonEnvelop<T, K> readResponse(Class<T> t, Class<K> k)

还有一个实现了InvocationHandler的类,在invoke函数中,会调用泛型函数,如下所示:

JsonEnvelop<ResHeader, ?> response = conn.readResponse(ResHeader.class, method.getReturnType());

现在我想要一个 C# 版本:然后我将通用函数翻译如下:

public JsonEnvelop<T, K> readResponse<T,K>()

而我想在一个实现了RealProxy的类的invoke body中调用该函数,如何实现与java版本相同的结果?第一个泛型可以是ResHeader,但是第二个要从methodCall判断,那怎么传参数K呢?

public override IMessage Invoke(IMessage msg)
{
var methodCall = msg as IMethodCallMessage;
var response = conn.readResponse<ResHeader, Typge.Get(methodCall.TypeName)>();
return new ReturnMessage(response.getBody(), null, 0, methodCall.LogicalCallContext, methodCall);
}

另一个问题是有没有更好的方法将java代码转换成C#?

非常感谢!

谢谢 Aron,详细问题是:

我有不同的服务,对于每个服务,它会提供多种功能。每个函数都会发送请求并获得响应。请求和响应会因功能和服务而异。设计是使用 RealProxy 发送请求并获得响应。这里的“public JsonEnvelop readResponse(Class t, Class k)”是获取响应,对于不同的服务和功能,T和ResHeader是一样的,但是K有很大的不同,它依赖于参数。

GetRealTimeQueryDataRequest request = new GetRealTimeQueryDataRequest();
GetRealTimeQueryDataResponse response=reportService.getRealTimeQueryData(request);

以上面为例,会调用realproxy实现类中的invoke函数,K应该是返回类型GetRealTimeQueryDataResponse

最佳答案

C# 不像 Java 那样支持“通配符泛型”。通常为了解决这个问题,您可以利用 C# 中称为“通用类型推断”的功能,其中在调用方法时推断通用包装函数的类型(有许多旧的 SO 答案比较这些)。

C# 中的一个简单示例是您可以使用“?”在 Java 中:

public T GetItem<T>(ICollection<T> input, int n) {
return input.ElementAt(n);
}
var items = new List<int>() { 1, 2, 3 };
int secondItem = GetItem(input, 2); // int is inferred based on generic type of collection item

对于您的示例,您可能需要重新处理方法签名,以便能够为 .NET 提供足够的上下文来推断您的 Invoke 方法的泛型类型。

由于您的具体示例仅使用 IMessage 作为参数和返回对象,泛型类型推断在这里无法直接提供帮助,并且如上所述,由于缺乏对泛型通配符的支持,因此无法将此代码直接转换为 C# .您必须探索其他解决方法,例如比仅 IMessage 更明确,以便为类型推断提供足够的上下文,或利用其他数据类型重写代码(动态、字典等)。

关于c# - 如何通过C#在动态代理中调用泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216965/

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