如何创建可以修改的MethodExecutionArgs.Arguments的副本?

时间:2016-01-15 04:15:03

标签: c# logging postsharp privacy

我正在使用postharps OnMethodBoundaryAspect。覆盖此示例中的条目,以便我可以记录参数以进行跟踪。我要求屏蔽潜在的个人身份信息。

使用下面的代码,我可以通过扫描那些标有“PII”属性的属性来实现。但是,问题是出于某种原因,我无法创建Arguments对象的副本。我甚至尝试使用Arguments的“Clone”方法,但每当我使用SetValue来更新属性时它仍会被更改。

这里有什么我想念的吗?

public override void OnEntry(MethodExecutionArgs args){
    int count = args.Arguments.Count();
    object[] argsCopy = new object[count];
    args.Arguments.CopyTo(argsCopy, 0);
    foreach(var arg in argsCopy)
    {
         MaskPiiDecorated(arg);
    }
    WriteEvent((int)EventId.Info, argsCopy.ToArray());
}

private object MaskPiiDecorated(object arg)
{
    //Gets all properties
    IEnumerable<PropertyInfo> topProperties = arg.GetType().GetProperties();

    //Gets sub properties that could have properties 
    IEnumerable<PropertyInfo> nonValueTypeSubProperties = topProperties.Where(
            prop => !prop.PropertyType.IsValueType
            && prop.PropertyType != typeof(string)
            && prop.PropertyType.BaseType != typeof(Array));

    //Recursion for sub properties
    nonValueTypeSubProperties.ToList().ForEach(
            subProperty => { MaskPiiDecorated(subProperty.GetValue(arg)); });

    topProperties.Where(prop => prop.IsDefined(typeof(PiiAttribute), false))
            .ToList().ForEach(decor => { decor.SetValue(arg, "***REMOVED****"); });
    return arg;

}

1 个答案:

答案 0 :(得分:0)

克隆参数根据documentation创建一个浅表副本。这意味着原始参数实例的属性值仍然被修改。

当参数被序列化为文本表示时,作为WriteEvent方法的一部分进行屏蔽将更容易(并且在分配和速度方面更好)。