【问题标题】:Trying to transform delegate function to extension generics method with lambda尝试使用 lambda 将委托函数转换为扩展泛型方法
【发布时间】:2011-06-28 12:15:56
【问题描述】:

我的意图是... 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...);  

我很乐意接受任何建议。

【问题讨论】:

  • @ColinE,你明白我的意思,但不是全部

标签: c# .net generics lambda


【解决方案1】:

由于您的代码示例不完整,因此很难准确说明如何做到这一点。但是,据我了解,您有一个IEnumerable&lt;TSource&gt;,并且您想对该序列中所有项目的所有属性执行相同的操作?

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

第二件事是如何从每个元素的所有属性创建IEnumerable&lt;TResult&gt;。这不是那么容易!如果您的Prop0Prop1 可以存储为字典,这会有所帮助!

你可以使用反射。像这样的:

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

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

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

【讨论】:

  • 1.是的,我想加密此序列中所有项目的所有“或部分”“属性值”2。不,当我加密道具时。通过以前的代码语法,它反映了对 TSource 的更改,因此加密结果序列不是目标!真诚的。
猜你喜欢
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多