我想实现一个驻留在外部程序集中的接口。但是,该特定接口已标记为“内部”。有没有办法我仍然可以为我自己的类实现这个接口?
我知道如何在C#中使用反射来调用私有/内部方法,所以我想在这种情况下也应该使用反射。但是,我不知道怎么做。是的,我知道使用内部/私人内容通常是不明智的,但在这种情况下我没有看到其他解决方案。
更新:我无法以任何方式编辑/更改外部装配。它应该保持不变。
答案 0 :(得分:4)
您不能这样做,除非您可以更改包含界面的程序集以添加InternalsVisibleToAttribute,以您自己的程序集为目标。
答案 1 :(得分:2)
使用外部部件中的InternalsVisibleToAttribute指向要将内部类型公开给的程序集。
答案 2 :(得分:1)
只是为了获得一些背景,大概你想要将接口实现传递给这个程序集中的其他内容,这也是内部的,因为否则他们将无法编译这个其他程序集(这是一个错误的引用到公共方法参数的内部类型。)
我认为你必须使用Reflection.Emit构建一个实现接口的类型,通过反射获得接口的Type对象。这不是一个简单的任务,结果将是脆弱的,因为你正在挖掘其他人集会的内部。
其他选择:
答案 3 :(得分:0)
我有外部程序集的源代码,然后您可以使用指向程序集的InternalsVisibleTo
属性进行编译。这不是一个完美的解决方案,我经常将它用于单元测试而不是生产代码,但它可能值得一看。
基本上您需要做的就是将以下内容添加到项目中的AssemblyInfo.cs
代码文件中:
[assembly: InternalsVisibleTo("YourAssembly")]
如果YourAssembly
具有强名称,则必须放置程序集的完全限定名称,包括整个公钥(而不仅仅是令牌)。