尝试使用lambda将委托函数转换为扩展泛型方法

本文关键字:转换 函数 扩展 泛型方法 lambda | 更新日期: 2023-09-27 18:00:46

我的意图是…void加密'TSource'中的任何属性值,它可能是所有或部分属性,取决于选择器

这是我以前的代码:

   ...IEnumerable<TSource>().ForEach(delegate(TSource ts)
                                  { 
                                    ts.prop0 = ts.prop0.Encrypt();
                                    ts.prop1 = ts.prop1.Encrypt();
                                    Etc...
                                  });

IEnumerable扩展:

...ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
        {
            foreach (TSource item in source)
                action(item);
        }

字符串扩展名:

...string Encrypt(this string strPlainText)
    {
        if (!string.IsNullOrEmpty(strPlainText))
            return SomeClass.Encrypt(strPlainText);
        return strPlainText;
    }

重点是如何将以上所有内容转换为IEnumerable Extension,可能是也可能不是这样:

    //Encrypt all props. in Tsource.
   ...IEnumerable<TSource>().EncryptProp();  
    //Encrypt any prop. in Tsource. with selector property 
   ...IEnumerable<TSource>().EncryptProp(ts => ts.prop0);  
   ...IEnumerable<TSource>().EncryptProp(ts => ts.prop0,ts.prop1);  
   ...IEnumerable<TSource>().EncryptProp(ts => ts.prop0,ts.prop1,Etc...);  

我很乐意接受任何建议。

尝试使用lambda将委托函数转换为扩展泛型方法

很难准确地说出如何做到这一点,因为您的代码示例是不完整的。但是,据我所知,您有一个IEnumerable<TSource>,您想对该序列中所有项的所有属性执行相同的操作吗?

这需要几件事,首先看一下SelectMany。这会将源中的每个元素投影到一个新的序列中,将它们全部展开为一个序列。

第二件事是如何根据每个元素的所有属性创建IEnumerable<TResult>。这不是那么容易!如果您的Prop0Prop1可以存储为字典,这将有所帮助!

你可以使用反射。类似这样的东西:

IEnumerable<MyObject> source = ///your source
var allProperties = source.SelectMany(s =>
              typeof(MyType).GetProperties().Select(p => p.GetValue(s, null));

但是,由于字符串是不可变的,如果对结果序列进行加密,则源MyObject实例将不会反映此更改。

如果您真的想这样做,请将您的属性存储在字典中!