如何在泛型服务中调用泛型方法?
How to call a generic method in generic service?
我有一个通用的 class,其中一个字段是通用服务。在这个 class 中,我有一个名为 InitialQueue 的方法,它的目的是调用我提供给 InitialQueue 方法的通用服务方法之一。我的问题是我不知道如何调用该方法。
public class RabbitConsumer<I, E> : IHostedService
where I : class
where E : class
{
private readonly I service;
public RabbitConsumer(I service)
{
this.service = service;
}
public RabbitConsumer(Expression<Func<I, Func<E, object>>> method, IConfiguration config, string entryQueueName) : base()
{
InitialQue(method);
}
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Dispose();
return Task.CompletedTask;
}
private void InitialQue(Expression<Func<I, Func<E, object>>> method)
{
//For example this is the object that I get through RabbitMq
var myObject = JsonConvert.DeserializeObject<E>(new { Id = 1, Name = "My Category"});
//I need something like that but I don't have any idea what to do
service.Invoke(method(myObject));
}
}
正如 Mong Zhu 所提到的,如果您对更多传入的仿制药进行限定,例如
where I : class
你也可以添加其他东西,比如 new() 如果对象类型允许“new”来创建一个新实例,或者其他可以公开你正在尝试的方法的接口获得访问权。像
这样简单的改变
where I : class, new(), ICanDoThisInterface, ICanDoThatInterface
所以现在,只要您在“服务”字段中存储了“I”泛型,您就可以
var tmp = new I();
tmp.MethodFromTheICanDoThisInterface();
tmp.MethodFromTheICanToThatInterface();
处理泛型对象时有两种典型的方法。
一种是使用委托间接访问对象的任何属性或方法。 IE。将 Expression<Func<I, Func<E, object>>>
替换为 Func<I, E, object>
。这样你就可以用 method(service, myObject)
调用它。这通常是我的首选方法。
另一种选择是使用通用约束。 IE。创建接口
public interface IMyInterface<T>{
public object MyMethod(T obj);
}
并为您的 class、... where I : class, IMyInterface<E>
添加限制。这应该让你调用方法,service.MyMethod(myObject)
我有一个通用的 class,其中一个字段是通用服务。在这个 class 中,我有一个名为 InitialQueue 的方法,它的目的是调用我提供给 InitialQueue 方法的通用服务方法之一。我的问题是我不知道如何调用该方法。
public class RabbitConsumer<I, E> : IHostedService
where I : class
where E : class
{
private readonly I service;
public RabbitConsumer(I service)
{
this.service = service;
}
public RabbitConsumer(Expression<Func<I, Func<E, object>>> method, IConfiguration config, string entryQueueName) : base()
{
InitialQue(method);
}
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Dispose();
return Task.CompletedTask;
}
private void InitialQue(Expression<Func<I, Func<E, object>>> method)
{
//For example this is the object that I get through RabbitMq
var myObject = JsonConvert.DeserializeObject<E>(new { Id = 1, Name = "My Category"});
//I need something like that but I don't have any idea what to do
service.Invoke(method(myObject));
}
}
正如 Mong Zhu 所提到的,如果您对更多传入的仿制药进行限定,例如
where I : class
你也可以添加其他东西,比如 new() 如果对象类型允许“new”来创建一个新实例,或者其他可以公开你正在尝试的方法的接口获得访问权。像
这样简单的改变 where I : class, new(), ICanDoThisInterface, ICanDoThatInterface
所以现在,只要您在“服务”字段中存储了“I”泛型,您就可以
var tmp = new I();
tmp.MethodFromTheICanDoThisInterface();
tmp.MethodFromTheICanToThatInterface();
处理泛型对象时有两种典型的方法。
一种是使用委托间接访问对象的任何属性或方法。 IE。将 Expression<Func<I, Func<E, object>>>
替换为 Func<I, E, object>
。这样你就可以用 method(service, myObject)
调用它。这通常是我的首选方法。
另一种选择是使用通用约束。 IE。创建接口
public interface IMyInterface<T>{
public object MyMethod(T obj);
}
并为您的 class、... where I : class, IMyInterface<E>
添加限制。这应该让你调用方法,service.MyMethod(myObject)