C# 创建与反射类型匹配的方法

C# 创建与反射类型匹配的方法,c#,.net,reflection,delegates,codedom,C#,.net,Reflection,Delegates,Codedom,我正在使用第三方.net dll,我正在调用它。我正在简化我的代码,但它是这样的 // The assembly has already been loaded into 'ass' Type params = ass.GetType("RemoteCalls.ParametersDelegate"); Delegate UseDel = Delegate.CreateDelegate(params, this, "MyGetParams"); 然后我可以将这个委托(UseDel)传递到反射

我正在使用第三方.net dll,我正在调用它。我正在简化我的代码,但它是这样的

// The assembly has already been loaded into 'ass'

Type params = ass.GetType("RemoteCalls.ParametersDelegate");
Delegate UseDel = Delegate.CreateDelegate(params, this, "MyGetParams");
然后我可以将这个委托(UseDel)传递到反射对象中,它将在需要时调用MyGetParams

我遇到的问题是,方法签名是由第三方dll中的一个类型组成的

参数Legate的签名是

Parameters GetPars();
因此,我的方法无法返回正确的类型(参数)。我试过下列方法

private static class OtherDelegates<T>
{
    public static T MyGetParams()
    {
        //... code to build up the 'Parameters' class, and return it.
    }
}
私有静态类OtherDelegate
{
公共静态T MyGetParams()
{
//…用于构建“Parameters”类并返回该类的代码。
}
}
然后打电话给

Delegate UseDel = Delegate.CreateDelegate(params, this, "OtherDelegates<xxx>.MyGetParams");
Delegate UseDel=Delegate.CreateDelegate(params,这是“OtherDelegates.MyGetParams”);
但是我不知道在“xxx”里放什么

我想通过使用CodeDomProvider可以做到这一点,但想知道是否有更简单的方法

此外,由于许可问题,不能将DLL添加为引用

谢谢
丰富。

我会将第三方dll完全封装在您控制的库dll后面,使用接口上的第三方类型无。这意味着您可以单独引用(已构建的)库dll。显然,您仍然需要以第三方dll不可用时正常失败的方式进行编码

这也有副作用:

  • 您可以模拟实现进行测试
  • 如果第三方dll不存在,您可以提供回退策略
  • 您可能支持多个提供者
我已经非常成功地使用了上面的方法,例如,将MapPoint(地理布线)包装成一个很棒的弧形回退


另外,你不需要乱搞反射

如果许可问题作为参考影响到您,那么我看不出同样的许可问题如何通过使用反射神奇地不影响您。你能说得更具体些吗?这听起来很可疑…我希望我的软件能够使用这个DLL,如果它已安装/可用,我不希望它依赖于它。另外,从开发的角度来看,我不想把这个第三方dll安装到所有的开发机器上。无论如何,我宁愿绕开编码问题,而不是许可问题。此外,我们第三方软件的许可证数量有限,因此我不能在每次安装主软件时都发布它。以前做过类似的事情,我建议将外部dll隐藏在您自己的库dll后面(引用第三方dll),而不公开API上的任何第三方类型。然后,主应用程序代码引用包装器,一切正常。显然,您需要编写防御代码(如果第三方库不存在,则处理异常),但在您的示例中,您无论如何都需要这样做。它只是避免了所有这些反射混乱!是的,这是一个很好的解决方案。您介意我将这个问题留待讨论,只是想看看是否有一种通过代码来实现这一点的方法吗?我也非常渴望理解(而不是陷入其中)反射/委托等的复杂性。。