内部接口的扩展方法 Class
Extension Method for Interface in Internal Class
我目前正在尝试编写 Dynamic Linq 的扩展。为此,我需要向位于内部 class ExpressionParser
的 IEnumerableSignatures
接口添加一个方法签名。
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) {
...
}
}
如果ExpressionParser
和Extension
在不同的程序集里当然是行不通的,因为他们都是internal
.
没有访问修饰符和private是一样的,所以只需要在interface中加上internal
internal class ExpressionParser
{
internal interface IEnumerableSignatures
{
}
}
internal static class Extension
{
static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig)
{
}
}
它应该可以工作
我目前正在尝试编写 Dynamic Linq 的扩展。为此,我需要向位于内部 class ExpressionParser
的 IEnumerableSignatures
接口添加一个方法签名。
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) {
...
}
}
如果ExpressionParser
和Extension
在不同的程序集里当然是行不通的,因为他们都是internal
.
没有访问修饰符和private是一样的,所以只需要在interface中加上internal
internal class ExpressionParser
{
internal interface IEnumerableSignatures
{
}
}
internal static class Extension
{
static void DefaultIfEmpty(this ExpressionParser.IEnumerableSignatures sig)
{
}
}
它应该可以工作