Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试用lambda将委托函数转换为扩展泛型方法_C#_.net_Generics_Lambda - Fatal编程技术网

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

C# 尝试用lambda将委托函数转换为扩展泛型方法,c#,.net,generics,lambda,C#,.net,Generics,Lambda,我的意图是。。。void加密“TSource”中的任何属性值,它可以是全部或部分属性,具体取决于选择器。 这是我以前的代码: ...IEnumerable<TSource>().ForEach(delegate(TSource ts) { ts.prop0 = ts.prop0.Encrypt();

我的意图是。。。void加密“TSource”中的任何属性值,它可以是全部或部分属性,具体取决于选择器。

这是我以前的代码:

   ...IEnumerable<TSource>().ForEach(delegate(TSource ts)
                                  { 
                                    ts.prop0 = ts.prop0.Encrypt();
                                    ts.prop1 = ts.prop1.Encrypt();
                                    Etc...
                                  });
重点是如何将以上所有内容转换为IEnumerable扩展,即行语法,可能是这样,也可能不是这样:

    //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...);  
//加密所有道具。在Tsource中。
…IEnumerable().EncryptProp();
//加密任何道具。在Tsource中。具有选择器属性
…IEnumerable().EncryptProp(ts=>ts.prop0);
…IEnumerable().EncryptProp(ts=>ts.prop0,ts.prop1);
…IEnumerable().EncryptProp(ts=>ts.prop0、ts.prop1等);

我很乐意接受任何建议。

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

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

第二件事是如何从每个元素的所有属性创建一个
IEnumerable
。这可不容易!如果您的
Prop0
Prop1
可以存储为字典,这会有所帮助

你可以使用反射。大概是这样的:

IEnumerable<MyObject> source = ///your source
var allProperties = source.SelectMany(s =>
              typeof(MyType).GetProperties().Select(p => p.GetValue(s, null));
IEnumerable source=///您的源代码
var allProperties=source.SelectMany(s=>
typeof(MyType).GetProperties().Select(p=>p.GetValue(s,null));
但是,由于字符串是不可变的,如果加密结果序列,则源
MyObject
实例将不会反映此更改


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

@ColinE,您明白我的意思,但不是全部1。是的,我想对“属性值”的所有“或部分”进行加密对于这个序列中的所有项2.不,当我用以前的代码语法加密prop.时,它反映了对TSource的更改,所以加密结果序列不是目标!真诚的。
    //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<MyObject> source = ///your source
var allProperties = source.SelectMany(s =>
              typeof(MyType).GetProperties().Select(p => p.GetValue(s, null));