Попытка преобразовать функцию делегата в метод обобщений с помощью лямбды - PullRequest
0 голосов
/ 28 июня 2011

Я намерен ... void Зашифровать любое значение свойства в 'TSource', это может быть все или некоторые свойства зависят от селектора.

Это мой прежний код:

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

IEnumerable Extension:

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

string Extension:

...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...);  

Я был бы рад принять любые предложения.

1 Ответ

1 голос
/ 28 июня 2011

Трудно сказать, как именно это можно сделать, потому что пример кода неполон.Однако из того, что я могу понять, у вас есть 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 не будут отражать это изменение.

Если вы действительно хотите сделать это, храните ваши свойства в словаре!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...