内部类接口的扩展方法

时间:2015-06-25 09:06:23

标签: c# .net extension-methods dynamic-linq internal-class

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

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

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

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

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

有没有办法为这样的界面添加扩展方法,还是我不得不弄乱原始代码?

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

3 个答案:

答案 0 :(得分:6)

您不能这样做,因为private是一个私有接口(它没有访问修饰符,默认值为ExpressionParser),并且无法从{{1}外部访问它} 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; }
    }
}

如果你把钥匙交给某人,你就无法隐藏你家(外层)的安全(私人/不太容易/内在的类)。

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

答案 1 :(得分:1)

界面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

答案 2 :(得分:1)

没有访问修饰符与私有修饰符相同,因此只需在内部添加内部

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

    }
}

它应该可行