C# 如何在集合中存储具有泛型返回类型的方法?

C# 如何在集合中存储具有泛型返回类型的方法?,c#,generics,delegates,C#,Generics,Delegates,因此,我的目标是创建一个类(ProviderManager),您可以要求该类按以下类型返回对象: var a = ProviderManager.GetObject<ObjA>(); public class ProviderManager { private readonly Dictionary<Type, Func<object>> _providerMapping = new Dictionary<Type, Func&

因此,我的目标是创建一个类(ProviderManager),您可以要求该类按以下类型返回对象:

var a = ProviderManager.GetObject<ObjA>();
public class ProviderManager
{
    private readonly Dictionary<Type, Func<object>> _providerMapping =
        new Dictionary<Type, Func<object>>();

    public void Register<T>(IProvider<T> provider)
    {
        _providerMapping .Add(typeof(T), () => provider.GetObject());
    }

    public T GetObject<T>()
    {
        if (!_providerMapping.TryGetValue(typeof(T), out var factory))
            throw ...
        return (T)factory();
    }
}
var a=ProviderManager.GetObject();
ProviderManager拥有一个将类型映射到委托的字典,这些委托是创建具体类型对象的类(Provider>。调用GetObject时,ProviderManager调用创建具体对象的函数。 提供者在一个单独的项目中实现

供应商经理
公共类ProviderManager
{
专用只读词典_ProviderMapping=新词典();
公共无效寄存器(类型objType,IProvider提供程序)
{
_添加(objType,provider.GetObject());
}
公共T GetObject()
{
_ProviderMapping.FirstOrDefault(t=>t.Key==typeof(t)).Value();
}
}
提供者接口
公共接口IProvider
{
无效寄存器();
T GetObject();
}
样本提供者
公共类提供程序a:IProvider
{
私人供应商经理(u经理),;
公共ProviderForA(ProviderManager)
{
_经理=经理;
}
公开作废登记册()
{
_经理注册(类型(ObjA),本);
}
public ObjA GetObject()
{
返回新的ObjA();
}
}
问题是,_ProviderMapping.Add(objType,provider.GetObject())导致错误“无法将T转换为Sytem.Action”。添加一个void函数可以工作,因此我猜它连接到了返回值。我还尝试向Action添加一个通用返回类型,但这也不起作用


目标是,项目(提供者模块)负责创建对象,它在提供者管理器(管理器模块)上注册一个实现提供者接口的类。然后,用户代码向管理器模块请求一个具体类型的对象。管理器将调用转发给返回实际对象的提供程序。

您可能需要这样的内容:

var a = ProviderManager.GetObject<ObjA>();
public class ProviderManager
{
    private readonly Dictionary<Type, Func<object>> _providerMapping =
        new Dictionary<Type, Func<object>>();

    public void Register<T>(IProvider<T> provider)
    {
        _providerMapping .Add(typeof(T), () => provider.GetObject());
    }

    public T GetObject<T>()
    {
        if (!_providerMapping.TryGetValue(typeof(T), out var factory))
            throw ...
        return (T)factory();
    }
}

我们有一个包含大量委托的字典,这些委托返回不同的类型。我们必须使用其中的常见类型,即
object
,并在字典中存储
Func
s。然后,我们将
对象
强制转换为
GetObject()中相应的
T

您可能想要这样的东西:

var a = ProviderManager.GetObject<ObjA>();
public class ProviderManager
{
    private readonly Dictionary<Type, Func<object>> _providerMapping =
        new Dictionary<Type, Func<object>>();

    public void Register<T>(IProvider<T> provider)
    {
        _providerMapping .Add(typeof(T), () => provider.GetObject());
    }

    public T GetObject<T>()
    {
        if (!_providerMapping.TryGetValue(typeof(T), out var factory))
            throw ...
        return (T)factory();
    }
}

我们有一个充满了返回不同类型的委托的字典。我们必须使用这些委托中的常见类型,即
object
,并将
Func
s存储在字典中。然后我们将
对象
强制转换为
GetObject()
\u ProviderMapping.FirstOrDefault>中相应的
T
(t=>t.Key==typeof(t)).Value();
——通过提供O(1)的字典进行O(n)查找查找似乎很愚蠢。为什么不进行常规查找?您的
\u ProviderMapping
字典包含操作。操作不返回值。您是想让它包含
Func
s吗?使用字典索引器通过key@canton7是的,普通的查找会更好。我试图添加一个返回类型,但用object表示s“错误的返回类型”,我也尝试了Func,但它仍然显示“错误的返回类型”。
\u ProviderMapping.FirstOrDefault(t=>t.Key==typeof(t)).Value();
--通过提供O(1)的字典进行O(n)查找查找似乎很愚蠢。为什么不进行常规查找?您的
\u ProviderMapping
字典包含操作。操作不返回值。您是想让它包含
Func
s吗?使用字典索引器通过key@canton7是的,普通的查找会更好。我试图添加一个返回类型,但用object表示s“错误的返回类型”,我也尝试了Func,但它仍然显示“错误的返回类型”。