let data = [
{"id":1,"name":"admin","password":"admin","role":"Admin"},
{"id":2,"name":"user","password":"user","role":"User"},
{"id":3,"name":"superadmin","password":"superadmin","role":"superadmin"}
];
var out_data = data.reduce((a, b) => a + 'name: ' + b.name + ', password: ' + b.password + ' ', '');
console.log(out_data);
Ваш код переписан. Не использует ни LINQ, ни переменную
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo p in properties)
{
// Only work with strings
if (p.PropertyType != typeof(string)) { continue; }
// If not writable then cannot null it; if not readable then cannot check it's value
if (!p.CanWrite || !p.CanRead) { continue; }
MethodInfo mget = p.GetGetMethod(false);
MethodInfo mset = p.GetSetMethod(false);
// Get and set methods have to be public
if (mget == null) { continue; }
if (mset == null) { continue; }
foreach (T item in list)
{
if (string.IsNullOrEmpty((string)p.GetValue(item, null)))
{
p.SetValue(item, replacement, null);
}
}
}
}
Вы найдете свойства как таковые с помощью BindingFlags.Public | BindingFlags.Instance
. Затем вам нужно будет изучить каждый экземпляр PropertyInfo, проверив свойства CanWrite и CanRead, чтобы выяснить, доступны ли они для чтения и / или записи.
Обновление: пример кода
PropertyInfo[] props = yourClassInstance.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < props.Length; i++)
{
if (props[i].PropertyType == typeof(string) && props[i].CanWrite)
{
// do your update
}
}
Я рассмотрел его более подробно после ваше обновление. Если вы также исследуете объекты MethodInfo, возвращаемые GetGetMethod и GetSetMethod, я думаю, вы попадете в цель;
var properties = typeof(TestSubject).GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(ø => ø.CanRead && ø.CanWrite)
.Where(ø => ø.PropertyType == typeof(string))
.Where(ø => ø.GetGetMethod(true).IsPublic)
.Where(ø => ø.GetSetMethod(true).IsPublic);
По умолчанию эти два метода возвращают только общедоступные геттеры и сеттеры (рискуя получить исключение NullReferenceException в таком случае), но передавая true
, как указано выше, заставляет их также возвращать частные. Затем вы можете изучить свойства IsPublic
(или IsPrivate
).
Если вы не укажете какие-либо флаги привязки, вы получите общедоступные свойства экземпляра - что вам и нужно. Но тогда вам нужно будет проверить, имеет ли PropertyType в объекте PropertyInfo тип String. Если вы не знаете заранее, вам также необходимо проверить, доступно ли свойство для чтения / записи, как указывает @Fredrik.
using System.Linq;
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
var properties = typeof(T).GetProperties()
.Where( p => p.PropertyType == typeof(string) );
foreach(var p in properties)
{
foreach(var item in list)
{
if(string.IsNullOrEmpty((string) p.GetValue(item, null)))
p.SetValue(item, replacement, null);
}
}
}
Я предлагаю другой подход: AOP .
Вы можете перехватить установщик и установить желаемое значение на действительное. С PostSharp это довольно просто.
Я согласен с другими ответами, но я предпочитаю рефакторинг самого поиска, чтобы его можно было легко запрашивать с помощью Linq, поэтому запрос может быть следующим:
var asm = Assembly.GetExecutingAssembly();
var properties = (from prop
in asm.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
where
prop.PropertyType == typeof (string) &&
prop.CanWrite &&
prop.CanRead
select prop).ToList();
properties.ForEach(p => Debug.WriteLine(p.Name));
Я взял в качестве примера тип сборки , который не имеет строковых свойств чтения / записи, но если тот же код выполняет поиск только прочитанных свойств, результат будет:
Какие строка только для чтения Свойства типа сборки
BindingFlags.Public | BindingFlags.Instance должен это сделать
GetSetMethod ()
http://jefferytay.wordpress.com/2010/05/03/simple-and-useful-tostring/
для метода переопределения строки, который позволяет вам получить все свойства класса
{ {1}}