内部类中接口的扩展方法
本文关键字:扩展 方法 接口 内部类 | 更新日期: 2023-09-27 17:59:42
我目前正在尝试为Dynamic Linq编写扩展。为此,我需要向位于内部类ExpressionParser
中的IEnumerableSignatures
接口添加一个方法签名。
internal class ExpressionParser
{
interface IEnumerableSignatures
{
[...]
}
}
虽然我可以直接将签名添加到代码中,但我更愿意将其定义为接口的扩展方法,以保持原始代码的整洁。通常,为了添加方法DefaultIfEmpty
,我会做这样的事情:
internal static class Extension
{
static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig);
}
但这会导致访问错误,因为ExpressionParser
是内部的。我已经尝试了类和方法的几种访问级别组合。
有没有办法给这样的接口添加一个扩展方法,或者我必须处理原始代码?
[edit]事实证明,即使将接口本身设置为内部(或公共),动态linq也无法识别它。我在运行时仍然得到一些未找到的异常。因此,没有(明显的)方法来编辑codeplex代码[/edit]
您不能这样做,因为IEnumerableSignatures
是一个私有接口(它没有访问修饰符,默认的是private
),并且无法从ExpressionParser
类之外访问它。
但是,如果您可以更改接口访问修饰符,那么如果您正确分配访问修饰符,应该不会有问题。
internal static class Extension
{
internal static int Foo(this ExpressionParser.IEnumerableSignatures b)
{
return b.Ib;
}
}
internal class ExpressionParser
{
public int Ia { get; set; }
internal interface IEnumerableSignatures
{
int Ib { get; set; }
}
}
如果你把钥匙交给别人,你就不能把你的保险箱(私人/不太方便/内舱)藏在你的房子里(外舱)。
不能在可访问性较高的类中使用可访问性较低的类。例如,在公共类中使用私有类。不能为内部类创建公共扩展方法,因为不能从程序集外部访问内部类,所以不能在程序集外部使用公共扩展方法!
接口IEnumerableSignatures
和方法DefaultIfEmpty
都是private
。如果你把它们做成internal
(或public
),它就会起作用。
internal class ExpressionParser
{
internal interface IEnumerableSignatures { }
}
internal static class Extension
{
internal static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig) {
...
}
}
如果ExpressionParser
和Extension
在不同的组件中,这当然永远不会起作用,因为它们都是internal
。
没有访问修饰符与private相同,所以只需将内部添加到面间
internal class ExpressionParser
{
internal interface IEnumerableSignatures
{
}
}
internal static class Extension
{
static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig)
{
}
}
它应该能在上运行