C#: Как получить всю общественность (и получают и устанавливают), свойства строки типа

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);
55
задан Svish 5 May 2009 в 02:28
поделиться

7 ответов

Ваш код переписан. Не использует ни 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);
            }
        }
    }
}
92
ответ дан 7 November 2019 в 07:19
поделиться

Вы найдете свойства как таковые с помощью 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 ).

9
ответ дан 7 November 2019 в 07:19
поделиться

Если вы не укажете какие-либо флаги привязки, вы получите общедоступные свойства экземпляра - что вам и нужно. Но тогда вам нужно будет проверить, имеет ли 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);
        }
    }
}
1
ответ дан 7 November 2019 в 07:19
поделиться

Я предлагаю другой подход: AOP .
Вы можете перехватить установщик и установить желаемое значение на действительное. С PostSharp это довольно просто.

0
ответ дан 7 November 2019 в 07:19
поделиться

Я согласен с другими ответами, но я предпочитаю рефакторинг самого поиска, чтобы его можно было легко запрашивать с помощью 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));

Я взял в качестве примера тип сборки , который не имеет строковых свойств чтения / записи, но если тот же код выполняет поиск только прочитанных свойств, результат будет:

  • CodeBase
  • EscapedCodeBase
  • FullName
  • Location
  • ImageRuntimeVersion

Какие строка только для чтения Свойства типа сборки

0
ответ дан 7 November 2019 в 07:19
поделиться

BindingFlags.Public | BindingFlags.Instance должен это сделать

GetSetMethod ()

0
ответ дан 7 November 2019 в 07:19
поделиться

http://jefferytay.wordpress.com/2010/05/03/simple-and-useful-tostring/

для метода переопределения строки, который позволяет вам получить все свойства класса

{ {1}}
1
ответ дан 7 November 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: