(Может быть, вы можете использовать DLR для достижения цели, если моих решений PostSharp недостаточно?)
Да, вы можете.Вы могли бы использовать атрибут вводит элемент в области видимости экземпляра.Лучше всего реализовать интерфейс с использованием postshsrp, а затем указать целевой класс в качестве этого интерфейса для предоставления метода.Вы также можете использовать Post.Cast <> () для доступа к нему во время разработки.
Вот два способа сделать это.Первый через интерфейс, второй использует заглушки.
Метод 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();
}