在 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 对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中定义 F# '**' 运算符

如何在 C# 中使用 libcinder?

在 C# 中使用 GitLabCI

如何在网站项目中使用 C# 7? [复制]

如何使用 SMO 在存储过程中调用 c# 函数?

在 C# 中使用 / 或 \\ 作为文件夹路径