我目前正在尝试编写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代码没有(明显的)方法。的 [/编辑]
答案 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) {
...
}
}
如果ExpressionParser
和Extension
位于不同的程序集中,那么它当然不会起作用,因为它们都是internal
。
答案 2 :(得分:1)
没有访问修饰符与私有修饰符相同,因此只需在内部添加内部
internal class ExpressionParser
{
internal interface IEnumerableSignatures
{
}
}
internal static class Extension
{
static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig)
{
}
}
它应该可行