gpt4 book ai didi

c# - 如何以编程方式创建 Func<> 委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 14:31:43 24 4
gpt4 key购买 nike

我有一个小的依赖注入(inject)框架,我试图让它解析 Lazy<>动态实例。这个想法是做这样的事情:

DIContainer.Register<IDbCommand,SqlCommand>();

var lazyCommand = DIContainer.Resolve<Lazy<IDbCommand>>();

前几天我读到 Autofac 能够做到这一点。

我一直在尝试为 Lazy<> 设置构造函数实例。在下一个测试代码中,将抛出一个异常,因为所需的类型构造函数需要一个 Func<arg>。 , 但我正在传递 Func<Object> :

    static readonly Type _lazyType = typeof(Lazy<>);
static Object ResolveTest(Type type)
{
if (type.IsGenericType && type.GetGenericTypeDefinition() == _lazyType)
{
var arg = type.GetGenericArguments()[0];

return Activator.CreateInstance(_lazyType.MakeGenericType(arg), new Func<Object>(() => ResolveType(arg)));
}
else
return ResolveType(type);
}

我不知道如何创建适合 Lazy<> 的委托(delegate)构造函数参数。有什么想法吗?

干杯。

最佳答案

这不是微不足道的。一种可能的解决方案是使用反射:

  1. 创建一个通用的 ResolveType 方法:

    public static T ResolveType<T>()
    {
    return (T)ResolveType(typeof(T));
    }
  2. 创建一个使用此方法的委托(delegate):

    // You probably want to cache this MethodInfo:
    var method = typeof(TypeContainingResolveType)
    .GetMethods()
    .Single(x => x.IsGenericMethod &&
    x.Name == "ResolveType")
    .MakeGenericMethod(arg);

    var delegate = Delegate.CreateDelegate(
    typeof(Func<>).MakeGenericType(arg),
    method);
  3. 使用该委托(delegate):

    return Activator.CreateInstance(_lazyType.MakeGenericType(arg), delegate);

关于c# - 如何以编程方式创建 Func<> 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19545539/

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