内部类中接口的扩展方法

本文关键字:扩展 方法 接口 内部类 | 更新日期: 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) {
        ...
    }
}

如果ExpressionParserExtension在不同的组件中,这当然永远不会起作用,因为它们都是internal

没有访问修饰符与private相同,所以只需将内部添加到面间

internal class ExpressionParser 
{
    internal interface IEnumerableSignatures
    {
    }
}
internal static class Extension
{
    static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig)
    {
    }
}

它应该能在上运行