任何帮助将不胜感激。我正在尝试在静态类型上实现动态对象包装器。这个包装器应该允许我在运行时动态调用静态函数。

例如:

dynamic obj = new StaticDynamicWrapper(typeof(MyStaticType));
obj.DoSomething(arg1);

这就是想法。我得到了一些在线引用,让它在非通用方法和属性上工作,但是当“DoSomething”实际上是一个通用方法时遇到了各种问题。

例如,如果“DoSomething”的声明如下:
public static RetType DoSomething<TArg>(this TArg arg1);

或者更糟糕的是,如果执行某些操作会导致以下签名过载...
public static RetType DoSomething<TArg>(this OtherGenericType<AnotherGenericType<TArg>> arg1);

所以我需要以这样一种方式实现 DynamicObject.TryInvokeMember 方法调用能够在运行时推断,基于运行时参数(即 object[] args),DoSomething 的正确封闭泛型方法。换句话说,我希望能够在运行时选择正确的重载并确定调用 MakeGenericMethod 的正确类型参数。

迄今为止最大的障碍是弄清楚如何将方法的开放泛型参数映射到由参数参数(即 object[] args)声明的封闭类型参数。任何人都可以帮助我吗?

谢谢你的时间!

最佳答案

DLR 将推断方法重载,包括泛型。通过 nuget 提供的开源框架 ImpromptuInterface 简化了 dlr calls to single method calls 并为您完成所有工作。事实上,它有一个基类 ImpromptuForwarder 可以通过一个小的构造函数更改来做到这一点。

using ImpromptuInterface;
using ImpromptuInterface.Dynamic;
public class StaticDynamicWrapper:ImpromptuForwarder{
    public StaticDynamicWrapper(Type target):base(InvokeContext.CreateStatic(target)){
    }
}

关于c# - 通过动态推断泛型类型。反射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6809063/

10-15 00:16
查看更多