内部接口的扩展方法 Class

Extension Method for Interface in Internal Class

我目前正在尝试编写 Dynamic Linq 的扩展。为此,我需要向位于内部 class ExpressionParserIEnumerableSignatures 接口添加一个方法签名。

internal class ExpressionParser
{
    interface IEnumerableSignatures
    {
        [...]
    }
}

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

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

虽然这会导致访问错误,因为 ExpressionParser 是内部的。我已经尝试过 class 和方法的几种访问级别组合。

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

[edit] 事实证明,即使将接口本身设为内部(或 public 就此而言),动态 linq 也无法识别它。我在运行时仍然遇到一些未找到的异常。所以没有(明显的)方法可以编辑 codeplex 代码。 [/edit]

你不能那样做,因为 IEnumerableSignatures 是一个私有接口(它没有访问修饰符,默认修饰符是 private)并且无法从 [=] 外部访问它13=] class.

但是如果您可以更改接口访问修饰符,那么如果您正确分配访问修饰符应该没有问题。

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; }
    }
}

如果你把钥匙给了别人,你就不能把你的保险箱(private/less accessible/inner class)藏在屋子里(外面class)。

您不能在具有较高辅助功能的 class 中使用辅助功能较差的 class。例如,在 public 中使用私有 class。您不能为内部的 class 创建 public 扩展方法,因为您不能在程序集外部使用 public 扩展方法,因为您无法访问内部 class来自程序集之外!

接口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是一样的,所以只需要在interface中加上internal

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

    }
}

它应该可以工作