Мне нужно получить список свойств из MyClass, исключая те, которые доступны только для чтения, могу ли я их получить?

public class MyClass
{
   public string Name { get; set; }
   public int Tracks { get; set; }
   public int Count { get; }
   public DateTime SomeDate { set; }
}

public class AnotherClass
{
    public void Some()
    {
        MyClass c = new MyClass();

        PropertyInfo[] myProperties = c.GetType().
                                      GetProperties(BindingFlags.Public |
                                                    BindingFlags.SetProperty |
                                                    BindingFlags.Instance);
        // what combination of flags should I use to get 'readonly' (or 'writeonly')
        // properties?
    }
}

И, наконец, я могу их отсортировать? Я знаю, как добавить OrderBy <>, но как? Я просто использую расширения. Заранее спасибо.

8
Shin 15 Мар 2013 в 22:10
На PropertyInfo есть пара свойств, которые указывают на возможность чтения / записи
 – 
Sam Axe
15 Мар 2013 в 22:13
myProperties.IsReadOnly - одно из свойств PropertyInfo []
 – 
MethodMan
15 Мар 2013 в 22:15
К вашему сведению: BindingFlags.SetProperty ничего не делает в этом контексте.
 – 
Tim Pohlmann
22 Авг 2019 в 14:55

1 ответ

Лучший ответ

Вы не можете использовать BindingFlags для указания свойств только для чтения или только для записи, но вы можете перечислить возвращаемые свойства, а затем протестировать свойства CanRead и CanWrite PropertyInfo следующим образом:

PropertyInfo[] myProperties = c.GetType().GetProperties(BindingFlags.Public |
                                                    BindingFlags.SetProperty |
                                                    BindingFlags.Instance);

foreach (PropertyInfo item in myProperties)
{
    if (item.CanRead)
        Console.Write("Can read");

    if (item.CanWrite)
        Console.Write("Can write");
}
12
Martin 15 Мар 2013 в 22:20
Извините, я забыл запрос на сортировку - как вы хотите их отсортировать? По чтению \ записи, только для чтения, только для записи или по имени и т. Д.?
 – 
Martin
15 Мар 2013 в 22:20
Если вы можете привести примеры из всего, что вы говорите, я буду очень благодарен.
 – 
Shin
15 Мар 2013 в 22:33
4
Теперь у меня есть PropertyInfo [] ... .Where (p => p.CanWrite) .OrderBy (x => x.Name) .ToArray ();
 – 
Shin
15 Мар 2013 в 23:10
1
Бесполезно включать BindingFlags.SetProperty в этот контекст, не так ли? В остальном GetProperties().Where(p => p.CanWrite) или, может быть, Where(p => p.CanRead && p.CanWrite) - хорошее решение.
 – 
Jeppe Stig Nielsen
15 Мар 2013 в 23:30