1

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

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

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

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

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

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

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

4

3 回答 3

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

如果您将钥匙交给某人,您就不能将您的保险箱(私人/不易接近/内舱)隐藏在您的房子(外舱)内。

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

于 2015-06-25T09:09:52.227 回答
1

接口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.

于 2015-06-25T09:12:17.793 回答
1

没有访问修饰符与私有相同,因此只需在接口中添加 internal

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

    }
}

它应该工作

于 2015-06-25T09:19:09.877 回答