2010-10-04 6 views
2

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

this.prop1 = "?"; 
//repeat for each prop 

Например:

public class thisClass() 
{ 
    library() 
    { 
     foreach (property as p in thisClass) 
     { 
      p.value = "?"; 
     } 
    } 

public string prop1 {get; set;} 
public string prop2 {get; set;} 
etc. 
} 
+0

Зачем вы хотите это сделать? Ваш ответ на это сильно влияет на ответ. – Gabe

+0

У меня есть класс со многими свойствами, которые должны иметь одно и то же значение по умолчанию, но после прочтения ответов и размышлений о нем было бы намного проще установить значения по умолчанию в конструкторе по одному свойству за раз. – etoisarobot

ответ

6

Вы можете сделать это с помощью Reflection (через Type.GetProperties и PropertyInfo.SetValue), но я бы не рекомендовал его. Это уменьшит читаемость и ремонтопригодность, а также окажет негативное влияние на производительность.

Преимущество перечисления свойств и определения их начальных значений заключается в том, что вы видите его прямо в своем конструкторе. Вы также можете предоставить поле поддержки для своих свойств и определить их в строках в полях.

0

Сделайте что-нибудь подобное. Прекрасно работает. Только проблему вы не можете положиться на заказ.

var properties = typeof(T).GetProperties(); 
foreach(var prop in properties){ 

} 

Из horses mouth: Метод GetProperties не возвращает свойств в определенном порядке, например, алфавитном или порядке декларации. Ваш код не должен зависеть от порядка возврата свойств, поскольку этот порядок меняется.

Это говорит о том, что ваша проблема лучше (как в программном обеспечении лучше), обращаясь к простому назначению всех свойств вручную. Если вы оказались в ситуации со слишком большим количеством свойств, вы должны использовать контейнер. A List<>, например.

0

я бы не рекомендовал его, но так как вы спрашиваете:

var props = GetType().GetProperties().Where(prop => prop.CanWrite && prop.PropertyType == typeof(string)) 
foreach(var prop in props) 
    prop.SetValue(this, "?", null); 
+0

Не работает с частными настройками. –

1

Я бы не сделать это, на самом деле. Свойства должны быть явно инициализированы конструкторами, поэтому они существуют. Не забудьте также инициализировать поля.

Но я не знаю, зачем вам это нужно, поэтому вот какой-то код.

Непросто надежно установить любое свойство, включая частные свойства. Обычно я делаю это так (из моей головы, я проверю с моим реальным кодом завтра):

var properties = this.GetType().Properties(
    BindingFlags.Instance 
    | BidningFlags.NonPublic 
    | BindingFlags.Public); 

foreach(PropertyInfo property in properties) 
{ 
    // if a property is declared on a base type with a private setter, 
    // get the definition again from the declaring type, 
    // unless you can't call the setter. 
    // Probably it is even more reliable to get the properties setter 
    // from the declaring type. 
    if (property.DeclaringType != this) 
    { 
     property = property.DeclaringType.GetProperty(
     property.PropertyName, 
     BindingFlags.Instance 
     | BidningFlags.NonPublic 
     | BindingFlags.Public); 
    } 

    if (property.CanWrite) 
    { 
     // assumed that you define a dictionary having the default values. 
     property.SetValue(this, defaultValues[property.PropertyType]; 
    } 
} 
0

я, вероятно, не рекомендую устанавливать все свойства на фиксированное значение, кроме нулевого ... В частности, как возможно, наивно предположить, что все ваши свойства довольны этим состоянием по умолчанию и тем более, что пользователи вашего класса, скорее всего, будут ожидать нулевого (или, точнее, default(T)) вместо неизвестного значения.

Как предложение, если это так, чтобы показать «?» в пользовательском интерфейсе, когда конкретные значения еще не известны, возможно, вы можете использовать соответствующие классы привязки в рамках.

Например, winforms Класс привязки имеет свойство «NullValue», которое будет передано в свойство связанного элемента управления, когда источник данных имеет значение NULL или DbNull.Value.

Но если вы действительно хотите пойти по пути, о котором вы просили, то, как было предложено выше, Type.GetProperties() должен сделать трюк.Убедитесь, что вы рассматриваете случаи унаследованных, абстрактных, переопределенных или виртуальных свойств и подходит ли значение по умолчанию - особенно в свете того, что норма установлена ​​/ оставляет значение null/default (T), когда вы этого не делаете фактически имеют известную ценность.

Смежные вопросы