是否可以使用PostSharp将方法添加到类中?如果是,那么是否可以引用其他类中的那些方法

本文关键字:方法 是否 那些 其他 引用 PostSharp 可以使 添加 如果 | 更新日期: 2023-09-27 18:00:57

假设我有一个类Abc:

class Abc {
}

我想在外部添加一些方法m()。我想这可能是可能的,尽管我不确定如何做到。假设这是可能的,那么让我们假设Abc从现在起确实有一个m()方法。

现在,假设我有其他类Def:

class Def {
    public void x(Abc abc) {
        abc.m();
    }
}

这个代码会和PostSharp一起运行吗?对于更分心的读者来说,问题是在标准的C#类程序中,我们的编译器可能不知道Abc类有m()方法。

我的直觉是,这对PostSharp不起作用。我错了吗?

是否可以使用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();
    }
}