内部类接口的扩展方法

bon*_*dle 1 .net c# extension-methods internal-class dynamic-linq

我目前正在尝试编写Dynamic Linq的扩展.为此,我需要为IEnumerableSignatures位于内部类中的接口添加方法签名ExpressionParser.

internal class ExpressionParser
{
    interface IEnumerableSignatures
    {
        [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我可以直接将签名添加到代码中,但我宁愿将其定义为接口的扩展方法,以保持原始代码的清洁.通常,要添加方法DefaultIfEmpty,我会这样做:

internal static class Extension 
{
    static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig);
}
Run Code Online (Sandbox Code Playgroud)

这会产生访问错误,因为它ExpressionParser是内部的.我已经尝试过几种类和方法的访问级别组合.

有没有办法为这样的接口添加扩展方法或者我是否需要弄乱原始代码?

[编辑]事实证明,即使将界面本身设置为内部(或公共内容),动态linq也无法识别它.我在运行时仍然遇到了一些未发现的异常.因此编辑codeplex代码没有(明显的)方法.[/编辑]

Ham*_*jam 6

你不能这样做,因为它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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你把钥匙交给别人,你就无法隐藏你家(外层)的保险箱(私人/不易进入/内部类).

您不能在具有更高可访问性的类中使用不易访问的类.例如,在公共类中使用私有类.您不能为内部类创建公共扩展方法,因为您无法在程序集外部使用公共扩展方法,因为您无法从程序集外部访问内部类!