【问题标题】:How do I create a copy of MethodExecutionArgs.Arguments that I can modify?如何创建可以修改的 MethodExecutionArgs.Arguments 副本?
【发布时间】:2016-04-20 15:32:33
【问题描述】:

我正在使用 postsharp 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;

}

【问题讨论】:

    标签: c# logging postsharp privacy


    【解决方案1】:

    Clone on Arguments 根据documentation 创建一个浅拷贝。这意味着原始参数实例的属性值仍然被修改。

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

    【讨论】:

    • 我也考虑过,但它不太符合要求,因为我需要屏蔽特定字段。我想出的解决方案是根据反射属性建立一个新列表,然后屏蔽/记录这些属性。
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2014-08-28
    • 2017-02-19
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多