[英]Trying to transform delegate function to extension generics method with lambda
我的意图是...... 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...);
我很乐意接受任何建议。
由于您的代码示例不完整,因此很难准确说明如何做到这一点。 但是,据我所知,您有一个IEnumerable<TSource>
并且您想对该序列中所有项目的所有属性执行相同的操作?
这需要做几件事,首先看看SelectMany
。 这会将源中的每个元素投影到一个新序列,将它们全部展平为一个序列。
第二件事是如何从每个元素的所有属性创建一个IEnumerable<TResult>
。 这不是那么容易! 如果您的Prop0
, Prop1
可以存储为字典,这会有所帮助!
你可以使用反射。 像这样的东西:
IEnumerable<MyObject> source = ///your source
var allProperties = source.SelectMany(s =>
typeof(MyType).GetProperties().Select(p => p.GetValue(s, null));
但是,由于字符串是不可变的,如果您对结果序列进行加密,您的源MyObject
实例将不会反映此更改。
如果您真的想这样做,请将您的属性存储在字典中!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.