Как исключить статическое свойство при использовании метода GetProperties

Мне было интересно, могу ли я исключить статическое свойство, когда я использую GetProperties() для извлечения всего свойства для определенного класса. Я знаю об использовании BindingFlags для этого, чтобы фильтровать свойства, которые мне нужны, но я действительно хочу, чтобы я хотел исключить статические свойства. Я пытаюсь использовать что-то вроде этого:

typeof(<class>).GetProperties(!BindingFlags.Static);

но я не думаю, что это работает, потому что VS выдает мне какую-то синтаксическую ошибку. Вот что внутри моего класса со свойствами.

public class HospitalUploadDtl : Base.Tables
        {
            public HospitalUploadDtl() { }
            public HospitalUploadDtl(SqlDataReader reader)
            {
                ReadReader(reader);
            }
            #region Properties
            public long BatchDtlId { get; set; }
            public long BatchNumber { get; set; }
            public string HospitalCode { get; set; }
            public string HospitalName { get; set; }
            public string Address { get; set; }
            public string City { get; set; }
            public string Country { get; set; }
            public string ContractPerson { get; set; }
            public string ContactNo { get; set; }
            public string Email { get; set; }
            public bool isAccredited { get; set; }
            public bool isClinic { get; set; }
            public string FaxNo { get; set; }
            public string TypeofFacility { get; set; }
            public string Category { get; set; }
            public string Specialty { get; set; }
            public string ProviderName { get; set; }
            public bool CashlessInPatient { get; set; }
            public bool CashlessOutPatient { get; set; }
            #endregion

            public static dcHospitalUploadDtl dataCtrl;
            public static dcHospitalUploadDtl DataCtrl
            {
                get
                {
                    if (dataCtrl == null)
                        dataCtrl = new dcHospitalUploadDtl();
                    return dataCtrl;
                }
            }
        }

для этого сценария я хочу исключить свойство DataCtrl при вызове GetProperties(). Спасибо за ответ. :)


person Rob    schedule 23.11.2012    source источник


Ответы (3)


Я думаю, вы ищете BindingFlags.Instance | BindingFlags.Public (если вы включите только Instance, никакие свойства не будут найдены, поскольку не указаны ни Public, ни NonPublic).

person Tim S.    schedule 23.11.2012

Звонок

typeof(<class>).GetProperties(!BindingFlags.Static);

не делает то, что вы ожидаете: значение, переданное в GetProperties, является битовой маской, а не выражением. Внутри выражения разрешены только побитовые операции ИЛИ. Другими словами, вы не можете говорить то, чего не хотите: вы должны говорить то, чего хотите. Поэтому вместо прохождения !BindingFlags.Static вы должны передать BindingFlags.Instance.

Кроме того, вы можете получить все свойства, а затем применить LINQ с его богатой семантикой фильтрации для удаления ненужных элементов:

typeof(<class>).GetProperties().Where(p => !p.GetGetMethod().IsStatic).ToArray();
person Sergey Kalinichenko    schedule 23.11.2012

Вы должны использовать флаг BindingFlags.Instance.

typeof(HospitalUploadDtl).GetProperties(BindingFlags.Instance | BindingFlags.Public);
person Douglas    schedule 23.11.2012