假设我有一个类Abc
:
class Abc {
}
我想在外部添加一些方法m()
。我想这可能是可能的,尽管我不确定如何做到。假设这是可能的,那么让我们假设Abc从现在起确实有一个m()
方法。
现在,假设我有其他类Def
:
class Def {
public void x(Abc abc) {
abc.m();
}
}
这个代码会和PostSharp一起运行吗?对于更分心的读者来说,问题是在标准的C#类程序中,我们的编译器可能不知道Abc
类有m()
方法。
我的直觉是,这对PostSharp不起作用。我错了吗?
(如果我的PostSharp解决方案不够,也许你可以使用DLR来完成?(
是的,你可以。您可以在实例范围的方面中使用Introductember属性。最好的办法是使用posthsrp实现一个接口,然后将目标类引用为该接口以公开该方法。您也可以使用Post。铸造<>((在设计时访问它。
这里有两种方法。第一种是通过接口,第二种是使用存根。
方法1-接口
public class Program
{
static void Main(string[] args)
{
Customer c = new Customer();
var cc = Post.Cast<Customer, ISomething>(c);
cc.SomeMethod();
}
}
public interface ISomething
{
void SomeMethod();
}
[AddMethodAspect]
public class Customer
{
}
[Serializable]
[IntroduceInterface(typeof(ISomething))]
public class AddMethodAspect : InstanceLevelAspect, ISomething
{
#region ISomething Members
public void SomeMethod()
{
Console.WriteLine("Hello");
}
#endregion
}
方法2-存根
public class Program
{
static void Main(string[] args)
{
Customer c = new Customer();
c.SomeMethod();
}
}
[AddMethodAspect]
public class Customer
{
public void SomeMethod() { }
}
[Serializable]
public class AddMethodAspect : InstanceLevelAspect
{
[IntroduceMember(OverrideAction = MemberOverrideAction.OverrideOrFail)]
public void SomeMethod()
{
Console.WriteLine("Hello");
}
}
更多信息以防使用Cast<>时出现一些问题((函数,它不执行实际的强制转换。编译后的结果看起来像:
private static void Main(string[] args)
{
Customer c = new Customer();
ISomething cc = c;
cc.SomeMethod();
}
如果类在不同的程序集中,则可以执行此操作。
另一方面,如果类在同一个模块中,那么你是对的,C#编译器不会编译它。为什么不在C#中像这样实现m()
,然后用PostSharp替换实现呢?
class Abc
{
public void m()
{
throw new NotImplementedException ();
}
}
编辑:
如果你把m()
放在一个接口中,然后使用PostSharp在你的类上实现这个接口,会怎么样?然后,您可以通过转换到该接口来调用该方法。
interface IM
{
void m();
}
class Def {
public void x(Abc abc) {
if (abc is IM)
((IM) abc).m();
}
}