Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用C语言调用动态代理中的泛型函数#_C#_Generics_Dynamic Proxy - Fatal编程技术网

C# 如何用C语言调用动态代理中的泛型函数#

C# 如何用C语言调用动态代理中的泛型函数#,c#,generics,dynamic-proxy,C#,Generics,Dynamic Proxy,java版本: 我的通用功能如下: public <T, K> JsonEnvelop<T, K> readResponse(Class<T> t, Class<K> k) JsonEnvelop<ResHeader, ?> response = conn.readResponse(ResHeader.class, method.getReturnType()); 以上面为例,它将调用realproxy实现类中的invoke函数,K

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

public <T, K> JsonEnvelop<T, K> readResponse(Class<T> t, Class<K> k)
JsonEnvelop<ResHeader, ?> response = conn.readResponse(ResHeader.class, method.getReturnType());
以上面为例,它将调用realproxy实现类中的invoke函数,K应该是返回类型GetRealTimeQueryDataResponse

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

C#中的一个简单示例是在Java中有一个“?”:

public T GetItem(ICollection输入,int n){
返回输入.ElementAt(n);
}
var items=newlist(){1,2,3};
int secondItem=GetItem(输入,2);//int是根据集合项的泛型类型推断的
对于您的示例,您可能需要重新处理方法签名,以便能够为.NET提供足够的上下文来推断
Invoke
方法的泛型类型


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

实现特定问题的方法是在接口中定义请求/响应

public interface IRequest<TResponse>
{

}

public class GetRealTimeQueryDataRequest : IRequest<GetRealTimeQueryDataResponse> {}
公共接口IRequest
{
}
公共类GetRealTimeQueryDataRequest:IRequest{}
从那里,您可以使用
.GetType().GetInterfaces()
通过过滤“is
typeof(IRequest)
”来获取
IRequest
。然后您只需要获取
IRequest
的泛型类型参数


然而,这似乎是一种非常奇怪的实现方式,因为使用依赖注入并只获取实现
IHandle
的服务要简单得多。这样你就不需要使用动力学了。

Java到c工具:你的问题是什么?我不明白你想达到什么目的。你说的“但是第二个应该从methodCall中判断”是什么意思?这听起来像是一个XY问题,你没有告诉我们X是什么,或者整个问题是什么,或者你是如何实现X的,所以我不知道你想如何将Y融入到解决方案中。继承RealProxy的整个类在做什么?感谢工具推荐。我尝试了它,它只是简单地转换了一些简单的特性,但无法处理诸如通用/动态代理之类的复杂条件
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);
}
GetRealTimeQueryDataRequest request = new GetRealTimeQueryDataRequest();
GetRealTimeQueryDataResponse response=reportService.getRealTimeQueryData(request);
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
public interface IRequest<TResponse>
{

}

public class GetRealTimeQueryDataRequest : IRequest<GetRealTimeQueryDataResponse> {}