在 C# 中使用 Castle.DynamicProxy 对数组进行排序
Posted
技术标签:
【中文标题】在 C# 中使用 Castle.DynamicProxy 对数组进行排序【英文标题】:Sort an array using Castle.DynamicProxy in C# 【发布时间】:2020-03-29 18:13:33 【问题描述】:我正在努力学习 AOP。我有一个返回数组的方法。
public class ReturnCollection
public virtual Array ReturnArrayStringData()
string[] IntArray = "1", "a", "4", "'", "&", "g" ;
foreach (var item in IntArray)
Console.WriteLine(item);
return IntArray;
我想使用 Castle.DynamicProxy 和 ArrayName.sort() 对该数组进行排序。这是我的代理方法。
[Serializable]
public abstract class Interceptor: IInterceptor
protected abstract void ExecuteAfter(IInvocation invocation);
public void Intercept(IInvocation invocation)
invocation.Proceed();
ExecuteAfter(invocation);
public class ExecuteAfterMethod: Interceptor
protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation)
//sort array here.
我该怎么做?谢谢。
【问题讨论】:
【参考方案1】:假设您只需要实现该方法,一种选择是重新分配invocation.ReturnValue
:
public class ExecuteAfterMethod : Interceptor
protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation)
var stringArray = (invocation.ReturnValue as string[]).Reverse().ToArray(); // here will have the object typed as String[], so printing it should be no problem.
foreach(var item in stringArray)
Console.WriteLine(item);
invocation.ReturnValue = stringArray; // and finally we reassign the result
【讨论】:
我出错了。 '未处理的异常。 System.ArgumentNullException:值不能为空。 (参数'源')在 System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument 参数)在 System.Linq.Enumerable.Reverse[TSource](IEnumerable`1 源)在 YonOdaklıProje.Interceptor.Intercept(IInvocation 调用)在城堡的第 16 行.DynamicProxy.AbstractInvocation.Proceed() at Castle.Proxies.KoleksiyonDöndürProxy.ReturnListStringData() at YonOdaklıProje.Program.Main(String[] args) in line 13' 您介意设置断点,在调试器中检查invocation
并检查ReturnValue
是什么?无论出于何种原因,我怀疑它要么是空的,要么不是字符串数组。所以无论它是什么类型 - 你都必须调整类型转换。
哦,我解决了,谢谢。我想用控制台写行将它打印到屏幕上。 System.String[] 在屏幕上显示。如何查看数组的元素?
可以选择在ArrayStringData
中执行此操作的相同方式:在您的反向行之后,执行类似foreach (var item in invocation.ReturnValue) Console.WriteLine(item);
的操作
我试过了,“foreach 语句不能对 'object' 类型的变量进行操作,因为 'object' 不包含 'GetEnumerator' 的公共实例定义”以上是关于在 C# 中使用 Castle.DynamicProxy 对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章